다중 상속을 할 시 예상치 못하게 클래스가 중복될 가능성이 있다.
class A
{
public:
int a;
};
class B : public A
{
public:
int b;
};
class C : public A
{
public:
int c;
};
class D : public B, public C
{
public:
int d;
};
A 클래스를 B, C 클래스가 상속받고 B, C 클래스를 D클래스가 상속받는 구조다.
문제는 이와같은 구조로 상속받을 때 A클래스의 내용물이 중복이 된다 하지만 중복되는 걸 희망하지 않을 때는 virtual 상속을 사용하면 된다.
클래스를 상속받을 때 상속받는 클래스에 virtual 을 앞에 붙여주면 된다 그렇게 되면, B, C 클래스를 상속받는 경우 B, C 클래스가 공통으로 virtual 상속받은 클래스 A에 대해서는 중복이 되지 않게 된다.
B 클래스가 A클래스를 virtual 상속 받을 때를 가상 베이스 클래스 형태로 A클래스를 상속받는다고 한다.
class A
{
public:
int a;
};
class B : virtual public A
{
public:
int b;
};
class C : virtual public A
{
public:
int c;
};
class D : public B, public C
{
public:
int d;
};
모호성이 사라졌기 때문에
D d;
d.a = 5;
와 같은 방식이 가능하다 하지만 virtual 이 붙지 않았더라면 모호성을 제거하기 위해 아래와 같이 사용해야 한다.
D d;
d.B::a = 5;
d.C::a = 6;
출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kyed203&logNo=220130441607
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 연산자 오버로딩 (0) | 2022.07.02 |
---|---|
RAII (Resource Acquisition Is Initialization) (0) | 2022.06.29 |
C++ _if STL 알고리즘 함수 (파라미터 _Pr _Pred) > 조건자 (Predicate) (0) | 2022.06.21 |
C++ 구조적 바인딩 (Structured Bindings) (0) | 2022.06.21 |
C++ STL 설명과 for-range 기반 loop (0) | 2022.06.21 |