2013-06-20 3 views
1
class B 
{ 
public: 
    B(char c = 'a') : m_c(c) {} 

public: 
    fun(); 

private: 
    char m_c; 
}; 

class C: virtual public B 
{ }; 

class D: virtual public B 
{ }; 

class E 
    : public C 
    , public D 
{ }; 

"가상"키워드가 클래스 E가 클래스 B의 복사본을 하나만 갖는 것을 어떻게 돕는 지 궁금합니다. 어떤 가상 키워드는 "클래스 C"에서 나중에 파생 클래스에 영향을 미칩니다 (이해할 수 있듯이 나는 가상 상속의 기본 작업을 이해하려고 노력하고 있습니다.이 질문의 대답을 찾으려고 노력했지만 얻지 못했습니다. 어떤 사람이라도 도움이 될 수있는 좋은 링크를 알고 있다면 제대로). 즉, 차이점은 무엇입니까가상 상속의 작동 방식

//1) 
class C: virtual public B 
{ }; 

//2) 
class C: public B 
{ }; 

우리는 C 등급을 더 이상 운전하지 않는 경우입니다. 객체를 생성하는 동안 1)과 2) 사이에 특별한 차이가있을 것입니다.

+0

이 링크는 귀하에게 유용 할 수 있습니다 : http://en.wikipedia.org/wiki/Virtual_inheritance –

답변

1

키워드 virtual은 "나 공유합니다"로되어 있습니다. 읽어없이 모두 virtual public B을 갖는 두 CD에 따라서

를 "나는 공유하지 않습니다"모두가 마지막 예 class C: public B에서 B에게

을 공유 할 준비가되어, 클래스 C는 공유하지 않습니다 - 즉 자신의 복사본을 가지고 .

0

더 이상 클래스 C를 작성하지 않은 경우 객체를 생성하는 동안 1)과 2) 사이에 특별한 차이가있을 것입니다. 건축 가상 기지의

  • 는 그 다른 기지가 이전 클래스 정의에 나와있는 경우에도, 다른 기본 클래스 전에 발생하며 파괴 이후에 발생합니다. 이것은 "C"클래스에 영향을주지 않지만, 다른 기본 클래스를 추가하면 가능합니다.

  • 가상 기본 클래스가있는 버전의 기본 생성자는 다양한 의미와 함께 "사소한"적이 될 수 없습니다. 예를 들어, 생성자가 아직 실행되지 않은 경우 (주로 동적으로로드 된 객체와 관련이 있음)조차도 쉽게 생성 된 객체의 데이터 멤버의 주소를 가져올 수 있습니다. 조합 등에서 사용할 때 약간의 차이가 있습니다.

구현 세부 사항은 표준에 규정되어 있지 않지만 가상 기반 클래스가 약간 더 크거나 구성 및/또는 파괴가 약간 느려질 수 있습니다.

예를 들어 중급 클래스의 생성자 초기화 목록에 가상베이스의 구성에 대한 인수가 지정되어 있으면 파생 클래스의 생성자를 대신하여 무시되고 생략 할 수 있습니다. 가상베이스에 기본 생성자가 없더라도 중급 클래스에서 생성되는 호출.