- c++ class 상속, 가상함수 테이블, 추상클래스2023년 08월 07일
- donghyk2
- 작성자
- 2023.08.07.:12
상속
class 자식클래스 : 접근제한자(public, protected, private) 부모클래스 { 추가 멤버 선언 };
- 틀을 가져다 그대로 복사하고 추가하는 느낌으로 이해했다.
- 자식 클래스에선 부모의 private는 접근할 수 없다.
private
는 해당 클래스 내에서만 접근이 가능하고,protected
는 해당 클래스와 하위 클래스에서 접근이 가능하다.- 접근 제한자를 설정하면 그 접근 제한자보다 높은 권한? 은 같은 권한으로 바꾼다.
- ex) private로 상속하면, 상속받은 부모의 public멤버도 다 private처리됨
- private < protected < public
- public으로 상속하면 그냥 권한 그대로 쓴다는 뜻.
- virtual ?
- 자식 클래스에서 함수를 재정의(override)할 때 부모 클래스의 함수와 헷갈리지 않게 해 주는 키워드이다.
- 부모 클래스의 소멸자를 virtual로 선언하지 않으면 자식 클래스의 소멸자가 작동하지 않는다. 그 이유는 가상함수로 정의되지 않은 자식 클래스의 오버라이딩된 함수를 선언하면 부모 클래스의 멤버 함수가 호출되기 때문이다. 이와 같은 이유로 자식 클래스의 메모리 해제가 필요하다면 반드시 부모 클래스에 소멸자를 작성해야 한다.
- == 같은 이름의 자식의 재정의 된 함수가 있으면 부모 함수가 먼저 실행돼서 생기는 일
- 메모리에 저장되는 방식
- 구조체처럼 size를 할당해서 멤버변수, 멤버 함수의 함수포인터 순으로 저장된다. 상속 시 추가된 멤버가 있으면 늘어난 사이즈만큼의 부분에 같은 순서대로 할당된다.
- ex) ppppppp cccc
- 가상함수 테이블
- c++에서는 가상함수를 그 함수포인터들을 모아놓은 가상 함수 테이블이란 걸 생성해서 관리한다.
- 가상함수를 추가하면 객체의 멤버 변수로 가상함수 테이블을 가리키는 포인터를 추가한다.
- 바이트 패딩 - https://younggwan.tistory.com/41
class Parent { public: virtual void func1(); virtual void func2(); }; class Child : public Parent { public: virtual void func1(); void func3(); };
https://koreanfoodie.me/835 #include <iostream> using namespace std; class Parent { public: virtual void func1() { cout << "P1" << endl; } void func2() { cout << "P2" << endl; } virtual void func3() { cout << "P3" << endl; } }; class Child : public Parent { public: virtual void func1() { cout << "C1" << endl; } virtual void func2() { cout << "C2" << endl; } }; int main() { Parent *c = new Child(); c->func1(); // Child의 가상함수테이블 참조 c->func2(); // Child의 가상함수테이블 참조 + 자식에도 virtual붙혀서 가독성++ c->func3(); } // 메모리 구조 // pppppppppppccccc
위와 같이 parent포인터지만 child를 가리키게 하는 업캐스팅 상황엔 c가 parent size만큼만 접근 가능하다.
즉 상속받으면서 추가된 child의 함수에 접근 불가능하다. 하지만 가상함수가 한 개라도 있으면 class 메모리의 첫 번째에 가상함수 테이블을 가리키는 포인터가 추가되는데 이를 통해 현재 객체에 맞는 가상함수를 찾아갈 수 있다.
순수 가상함수
말 그대로 진짜 가상 함수다. 아무것도 구현 안되어있는.
func()=0 이렇게 선언하고 반드시 오버라이딩해줘야 하는 함수이다.
이게 하나라도 있으면 인스턴스화할 수 없는 추상클래스가 된다
추상클래스
추상 클래스는 개념적으로 인스턴스화 할 수 없는 클래스. 즉, 인스턴스를 생성할 수 없는 클래스로, 일반적으로 하나 이상의 순수 가상 함수가 있는 클래스로 구현된다.
인터페이스
인터페이스는 구현이 없다.
즉, 인터페이스 클래스에는 가상 소멸자와 순수 가상함수만 포함된다.
인터페이스 클래스는 다형성 인터페이스, 즉 순수 가상 함수 선언을 기본 클래스로 지정하는 클래스이다.'<language> > c++' 카테고리의 다른 글
간단 echo server 구현 (C++) (2) 2023.10.16 c++ 레퍼런스(참조자) (8) 2023.07.06 c++ 동적할당 (0) 2023.07.06 cpp 파일 컨트롤(ifstream ofstream) (0) 2023.07.05 cpp split (0) 2023.05.29 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)