2012-06-20 3 views
0

가상 기본 클래스와 관련된 질문이 있습니다.가상 기본 클래스 개체 생성

class a 
{ 
public: 
    a(); 
    ~a(); 
}; 

class b: virtual public a 
{ 
public: 
    b(); 
    ~b(); 
}; 

class c: virtual public a 
{ 
public: 
    c(); 
    ~c(); 
}; 

class e: public b, c 
{ 
public: 
    e(); 
    ~e(); 
}; 

나는 a 객체가 e에서 작성되는 클래스를 통해 클래스 e의 객체를 생성 할 때마다?

+3

아무 것도 없습니다. 가상 기본 클래스는 가상 클래스의 상속 클래스와 "분리 된"클래스입니다 (실제로 가상 상속의 본질입니다). 'e :: e() : a (bla), b(), c() {...}'와 같이'a'의 기본이 아닌 생성자를 호출 할 수도 있습니다. –

답변

2

둘 다 공유됩니다.

귀하의 질문이 레이아웃에 관한 것이라면, 이것은 명시되지 않았습니다. 가상 상속이있는 예, 객체가 완전한 객체가 아닌 경우 메모리에서 비 연속적 일 수 있습니다.

기본 생성자가없는 경우 필요한 매개 변수를 제공하는 초기화 목록이 필요합니다. b와 c의 생성자에 의해 암시 된 것들은 무시 될 것이다.

1

단일 공유 인스턴스가 제공됩니다.

런타임까지 A에 대한 메모리 오프셋을 알 수 없으므로 컴파일러는 클래스 B와 C 모두 vpointer를 제공합니다. E의 인스턴스를 생성하면 A, B 및 C의 인스턴스도 생성됩니다.

B와 C 모두 vtable에 클래스 A에 대한 오프셋을 저장하는 가상 포인터가 포함되어 있습니다.이 가상 포인터는 런타임에 공유 A 객체를 가리 킵니다.

관련 문제