다중 상속의 경우 문제가 많다고 학교에서 교육을 받았고 딱히 사용해 본 적은 없다.
다중 상속을 할바에는 하나의 class 안에 has-a 포함 관계로 모두 넣어서 facade 방식으로 코딩을 주로 했다.
그래도 궁금했던 것이 다중상속관계에서 vitual 상속을 해야지 컴파일러에서 하나의 인스턴스만 보장해준다고 여러 블로그에서 확인했다.
아래 코드를 보면서 이해해 보자.
virtual 상속은 다중 상속에서 의미가 있습니다. virtual 상속을 함으로써 상속받은 클래스의 instance가 계층 구조 상에 여러 개 존재하는 것을 방지해줍니다.
class A { public: void Foo() {} };
class B : public A {};
class C : public A {};
class D : public B, public C {};
위 코드의 계층구조를 간략하게 보면 밑과 같은 다이아몬드 구조가 나옵니다. D가 B, C를 상속받고 B와 C 모두 A를 상속받지요.
A
/ \
B C
\ /
D
이런 상황에서는 모호함이 발생합니다.
D d;
d.Foo(); // 이건 B의 foo일까요? C의 foo일까요?
virtaul 상속은 이런 상황에서 쓰입니다. 클래스를 상속받을 때 virtual을 명시하면 컴파일러는 single instance만을 만듭니다.
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
이 계층구조는 이제 A의 인스턴스가 하나만 존재하지요. 더 이상 d.Foo(); 가 모호하지 않습니다.
일단 글로만 봐서는 이해가 안 갔다 그냥 virtual 상속을 하면 인스턴스를 하나만 보장해준다는 것인가.
https://docs.microsoft.com/ko-kr/cpp/cpp/multiple-base-classes?view=vs-2019의 그림과 함께 설명이 되어있는 이 부분에서 눈으로 보기 쉬워서 이해하기가 더 편하다.
Const 레퍼런스 전달 방식 (0) | 2020.06.22 |
---|---|
스마트포인터 (0) | 2020.06.22 |
네임스페이스 (0) | 2020.06.22 |
소멸자 (0) | 2018.09.30 |
STL VECTOR 오름차순, 내림차순 정렬 하기 (0) | 2018.08.21 |
댓글 영역