effective c++ & c++

virtual 상속

공대녀J 2022. 10. 20. 10:38
#include <iostream>
using namespace std;

class Base
{
public:
	Base() { cout << "Base Constructor" << '\n'; }
	void SimpleFunc() { cout << "Base" << '\n'; }
};

class MiddleDerivedOne : virtual public Base
{
public:
	MiddleDerivedOne() :Base()
	{
		cout << "MiddleDerivedOne Constructor" << '\n';
	}

	void MiddleFuncOne()
	{
		SimpleFunc();
		cout << "MiddleDerivedOne" << '\n';
	}
};

class MiddleDerivedTwo : virtual public Base
{
public:
	MiddleDerivedTwo() :Base()
	{
		cout << "MiddleDerivedTwo Constructor" << '\n';
	}

	void MiddleFuncTwo()
	{
		SimpleFunc();
		cout << "MiddleDerivedTwo" << '\n';
	}
};

class LastDerived : public MiddleDerivedOne, public MiddleDerivedTwo
{
public:
	LastDerived() : MiddleDerivedOne(), MiddleDerivedTwo()
	{
		cout << "LastDerived Constructor" << '\n';
	}

	void ComplexFunc()
	{
		MiddleDerivedOne();
		MiddleDerivedTwo();
		SimpleFunc();
	}
};

int main()
{
	LastDerived ob;
	ob.ComplexFunc(); //no error

	return 0;
}

virtual 키워드 없이 상속을 진행하게 되면 에러가 발생한다.

최상위 클래스의 함수를 호출할 때, 어떤 상위 클래스의 객체를 타고 가야하는 지에 대한 모호성이 존재하기 때문이다.