#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 키워드를 사용하여 가상으로 클래스를 상속할 수 있으며, 가상 상속하면 생성자, 소멸자가 여러 번 호출되지 않으며, 멤버 변수도 복제되어 상속받지 않는다.


참고자료

윤성우의_열혈_cpp_프로그래밍