3

파생 클래스 "D"에서 시퀀스를 변경하면 아래의 프로그램에서 기본 클래스의 생성자 순서가 달라집니다.다중 레벨 상속의 경우 가상 기본 클래스 생성자를 알 수 없습니다.

#include <iostream> 

    using namespace std; 

    class A { 
     public : 
      A() 
      { 
       cout << "A()" <<endl; 
      } 
    }; 

    class B : virtual A{ 
     public : 
      B() 
      { 
       cout << "B()" << endl; 
      } 
    }; 

    class C : virtual B{ 
     public : 
      C() 
      { 
       cout << "C()" << endl; 
      } 
    }; 

Case (1) 
======== 
    class D : public A, public B, public C 
    { 

    }; 

    int main() 
    { 
     D d; 
     return 0; 
    } 
OUTPUT : 
A() 
B() 
A() 
B() 
C() 

Case (2) 
======== 
    class D : public C, public B, public A 
    { 

    }; 

    int main() 
    { 
     D d; 
     return 0; 
    } 
OUTPUT : 
A() 
B() 
C() 
B() 
A() 

Case (3) 
======== 
    class D : public B, public A, public C 
    { 

    }; 

    int main() 
    { 
     D d; 
     return 0; 
    } 
OUTPUT : 
A() 
B() 
B() 
A() 
C() 

가상 클래스 개념의 경우 생성자가 어떻게 호출되는지 알려주십시오.

+0

가상 상속의 작동 방식을 잘 모르는 경우 http://ideone.com/Ptaf5u – kfsone

+0

개인 상속을 사용하는 이유는 무엇입니까? – curiousguy

답변

0

가상베이스는 항상 DFS 포스트 오더에서 처음으로 초기화됩니다. 이것은 가상 A와 B베이스가 먼저 초기화되고, B가 A에서 파생되기 때문에 B 이전의 A를 보장합니다. 그 후, 가상이 아닌 세 개의베이스 A, B, C는 예상대로 초기화 순서로 간단히 초기화됩니다.

2

가상 클래스 개념의 경우 생성자가 어떻게 호출되는지 알려주십시오.

initialization order에 따르면 가상 기본 클래스가 처음에 초기화됩니다. 생성자 ( 클래스들은베이스 클래스 선언 을의 깊이 우선 좌우 순회에 나타나는 순서대로 초기화 가장 파생 된 클래스, 가상베이스에 대한 것이면

1) 왼쪽에서 오른쪽으로는베이스 지정 목록의 모양)을 의미

2)가이 클래스의 기본 지정자 목록에 표시 그런 다음 직접 기본 클래스가 으로 왼쪽에서 오른쪽으로 초기화됩니다

3) 그런 다음 비 정적 데이터 멤버가순서로 초기화됩니다.클래스 정의의 선언.

4) 마지막으로, 생성자의 몸이 A, BC에서, D에 두 개의 가상 기본 클래스가있어, 클래스 D가 상속하는 모든 3의 경우

을 실행, 즉, ABC을 통해 상속 받고 BC을 통해 상속됩니다. A은 가장 기본 클래스이기 때문에 먼저 초기화되므로 모든 3 가지 경우에 A()B()이 처음에 인쇄됩니다.

그런 다음 직접 기본 클래스는 왼쪽에서 오른쪽 순서로 초기화됩니다. 첫 번째 경우에 그들은 두 번째 경우에 그들은 C()A()B()가, 3 경우에 그들이 B()A()C() 수있을 것입니다 수 있습니다, A()B()C() 수 있습니다.