main의 결과로
Base는 생성자에요. 매개변수는 : 10
Derived One 의 생성자에요. 매개변수는 : 15
Base는 생성자에요. 매개변수는 : 10
Derived Two 의 생성자에요. 매개변수는 : 100
000000719DEFF880
000000719DEFF890 // 주소가 둘이 다르다.
Base의 constructor가 두번 Call 되었다. 상속받은 member variable 의 주소도 둘이 다르다.
이는 Child class 가 같은 Base를 상속받은게 아닌, 서로 다른 두개의 Base로부터 상속 되었음을 보여준다.
이때 흔히 다이아몬드의 해결방법이라고 하는 virtual 로 가상 상속 받는 방법이 나온다.
class DerivedOne :virtual public Base
...
class DerivedTwo : virtual public Base
...
class Child : public DerivedOne, public DerivedTwo
{
public:
Child(int baseVal, int oneVal, int twoVal) : DerivedOne(oneVal, baseVal), DerivedTwo(twoVal, baseVal), Base(baseVal)
{ // 직접 Base의 Constructor를 call 해줘야 한다.
}
};
다시 실행 해보면 Base의 constructor가 한번만 호출 되는 것과, member variable의 주소가 똑같이 나오는 것을 볼 수 있다.
가상 상속을 받음으로써 서로 다른 두개의 Base가 아닌 하나의 Base로부터 상속받게 된 것이다.