가상 상속 (Virtual Inhertiance)
아래 예제와 같이 클래스를 'virtual'로 클래스를 상속받는 것을 '가상 상속'이라고 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <iostream> using namespace std; class Base { public: Base() { cout<<"Base Constructor"<<endl; } void BaseFunc() { cout<<"Base Func"<<endl; } }; class A : virtual public Base { public: A() : Base() { cout<<"A Constructor"<<endl; } void AFunc() { BaseFunc(); cout<<"A Func"<<endl; } }; class B : virtual public Base { public: B() : Base() { cout<<"B Constructor"<<endl; } void BFunc() { BaseFunc(); cout<<"B Func"<<endl; } }; class C : public A, public B { public: C() : A(), B() { cout<<"C Constructor"<<endl; } void CFunc() { AFunc(); BFunc(); BaseFunc(); } }; int main(void) { C c; c.CFunc(); return 0; } | cs |
-> 위 예제에서는 A,B 클래스가 Base클래스를 상속받고, C클래스가 A와 B를 다중상속 받고 있는 형태로 구현되어 있다.
C클래스는 Base클래스를 간접적으로 두번 상속받게 되는 것이다.
C클래스는 Base클래스를 간접적으로 두번 상속받게 되는 것이다.
[실행결과]
Base Constructor A Constructor B Constructor C Constructor 객체생성---- Base Func A Func Base Func B Func Base Func
만약 위 예제에서 클래스 상속 시 'virtual' 선언이 되어있지 않다면 A, B클래스의 영향으로 Base클래스의 멤버는 두개 생성되게 된다. (A의 BaseFunc, B의 BaseFunc), 이럴 경우엔 어느 클래스를 통해서 간접 상속한 Base클래스의 멤버함수를 호출할지를 명시해주어야 한다.
-> A::BaseFunc(); or B::BaseFunc();
그러나 virtual를 통해 '가상 상속'받게 되면 A,B가 동시에 상속받는 Base 클래스의 멤버는 하나씩만 존재하게 된다.
* 또한 위 예제에서 실행결과 Base의 생성자는 한번만 호출되고 있는 것을 알수있다. 그러나 가상 상속을 받지 않게 된다면, A,B의 Base 각각 생성하며 생성자가 2번 호출되는 것을 확인할 수 있다.
[참고자료]
윤성우 열혈 C++ 프로그래밍 09-2 다중상속(Multiple Inheritance)에 대한 이해
728x90
'Software Development > C, C++' 카테고리의 다른 글
[C++] 단항 연산자 오버로딩 (0) | 2019.01.03 |
---|---|
[C++] 연산자 오버로딩 (0) | 2019.01.03 |
[C++] 오버라이딩과 가상함수 (0) | 2019.01.01 |
[C++] 상속(Inheritance) (0) | 2018.12.31 |
[C++] C++에서의 static (0) | 2018.12.30 |