2014-10-22 4 views
1

나는 다이아몬드 문제에 대해 알고있다. 그러나 문제는 - 내가 "가상 상속"이라고했을 때 결과는 라고만 말하며 다이아몬드 문제는이다. 나는 그것이 일반적으로 어떻게 작용하는지, 그것이 정상적인 상속과 어떻게 다른지 알고 싶다.가상 상속은 실제로 어떻게 작동합니까?

클래스가 (일반적으로) 다른 클래스에서 상속 받았을 때 단순히 모든 멤버 (필드 및 메서드, 액세스 수준 제외) 만 포함한다는 것을 알고 있습니다. 그들 중 일부는 신입 회원들에 의해 무시되거나 숨겨 질 수 있지만 여전히 존재합니다. 상속은 또한 캐스팅과 다형성에 영향을주는 계층 구조의 클래스들 간의 특정 관계를 정의합니다.

가상 상속은 어떻게 다른가요? 예를 들어 :

BC의 차이점은 무엇
class A 
{ 
    public: 
    int a; 
    int b; 
    void fun(int x) 
    {} 
    void gun(int x) 
    {} 
}; 

class B : public A 
{ 
    public: 
    int a; 
    int c; 
    void fun(int x) 
    {} 
    void hun(int x) 
    {} 
}; 

class C : virtual public A 
{ 
    public: 
    int a; 
    int c; 
    void fun(int x) 
    {} 
    void hun(int x) 
    {} 
}; 

? 내 예제가 악용하지 않는 다른 점이 있습니까? 표준은 무엇을 말하고 있습니까? 또한 C++ 03과 C++ 11 사이에 차이가 있다면 언급하십시오.

+0

차이점은 'B'에서 상속 한 클래스와 'C'에서 상속 한 클래스 사이에 차이가 있습니다. –

+0

죽음의 두려운 다이아몬드에 대한 결과만을 얻는 이유는 그것이 가상의 상속이 해결할 수있는 유일한 문제이기 때문입니다. 차이점은 DDoD에서 가장 많이 파생 된 클래스에 있습니다. – rightfold

+0

구현 상 (예 : vtable) 외에 일반 상속과 가상 상속 사이에는 아무런 차이가 없다는 말입니까? – NPS

답변

5

상속의 단일 수준으로 동작에는 차이가 없습니다. 자체는 일반적인 기본 클래스를 가진 여러베이스 클래스로부터 상속 할 때

차이는 : 가상 상속이 예에서는

struct A {}; 
struct B : virtual A {}; 
struct C : virtual A {}; 
struct D : B,C {}; 

D 하나만 A 부 객체를 포함하는 그 BC subobjects share;

A 
/\ 
    B C 
    \/
    D 

가상 상속하지 않고,이 두 A 하위 개체를 포함 할 것없이 "다이아몬드": 이것은 "다이아몬드"패턴으로 또는 다중 상속없이

A A 
    | | 
    B C 
    \/
    D 

, 거기에 여전히 둘 이상의 레벨 상속이있는 경우의 차이 : 가상 기본 클래스는 직접 파생 클래스가 아니라 가장 많이 파생 된 클래스에 의해 초기화되어야합니다. 이것은 다중 상속의 경우 애매함을 피하기위한 것입니다. 위의 예에서 BC은 공유 된 A을 초기화해야합니다.

+0

다시 말해서 가상 상속은 파생 된 객체 (계층 구조의 모든 수준에서)가 가상 상속 된 클래스의 하위 객체 하나를 정확히 포함하는지 확인하는 것입니까? – NPS

+1

@ NPS : 네, 그렇습니다. –

관련 문제