#include <iostream>
using namespace std;
class Base
{
public :
Base() { cout<<"Base Constructor"<<endl; }
void SimpleFunc() { cout<<"BaseOne"<<endl; }
};
class MiddleDerivedOne : virtual public Base
{
public :
MiddleDerivedOne() : Base()
{
cout<<"MiddleDerivedOne Constructor"<<endl;
}
void MiddleFuncOne()
{
SimpleFunc();
cout<<"MiddleDerivedOne"<<endl;
}
};
class MiddleDerivedTwo : virtual public Base
{
public :
MiddleDerivedTwo() : Base()
{
cout<<"MiddleDerivedTwo Constructor"<<endl;
}
void MiddleFuncTwo()
{
SimpleFunc();
cout<<"MiddleDerivedTwo"<<endl;
}
};
class LastDerived : public MiddleDerivedOne, public MiddleDerivedTwo
{
public :
LastDerived() : MiddleDerivedOne(), MiddleDerivedTwo()
{
cout<<"LastDerived Constructor"<<endl;
}
void ComplexFunc()
{
MiddleFuncOne();
MiddleFuncTwo();
SimpleFunc();
}
};
int main(void)
{
cout<<"객체 생성 전 ..... "<<endl;
LastDerived ldr;
cout<<"객체 생성 후 ..... "<<endl;
ldr.ComplexFunc();
return (0);
}
다중 상속에서 하나의 클래스가 다른 클래스를 간접적으로 여러 번 상속받는 경우, 부모 클래스의 생성자, 소멸자를 여러 번 호출하며, 멤버 변수도 복제되어 여러 번 상속받는다는 문제가 존재한다.
virtual 키워드를 사용하여 가상으로 클래스를 상속할 수 있으며, 가상 상속하면 생성자, 소멸자가 여러 번 호출되지 않으며, 멤버 변수도 복제되어 상속받지 않는다.
참고자료