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 키워드 없이 상속을 진행하게 되면 에러가 발생한다.
최상위 클래스의 함수를 호출할 때, 어떤 상위 클래스의 객체를 타고 가야하는 지에 대한 모호성이 존재하기 때문이다.