나는 다이아몬드 문제에 대해 알고있다. 그러나 문제는 - 내가 "가상 상속"이라고했을 때 결과는 라고만 말하며 다이아몬드 문제는이다. 나는 그것이 일반적으로 어떻게 작용하는지, 그것이 정상적인 상속과 어떻게 다른지 알고 싶다.가상 상속은 실제로 어떻게 작동합니까?
클래스가 (일반적으로) 다른 클래스에서 상속 받았을 때 단순히 모든 멤버 (필드 및 메서드, 액세스 수준 제외) 만 포함한다는 것을 알고 있습니다. 그들 중 일부는 신입 회원들에 의해 무시되거나 숨겨 질 수 있지만 여전히 존재합니다. 상속은 또한 캐스팅과 다형성에 영향을주는 계층 구조의 클래스들 간의 특정 관계를 정의합니다.
가상 상속은 어떻게 다른가요? 예를 들어 :
B
와
C
의 차이점은 무엇
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 사이에 차이가 있다면 언급하십시오.
차이점은 'B'에서 상속 한 클래스와 'C'에서 상속 한 클래스 사이에 차이가 있습니다. –
죽음의 두려운 다이아몬드에 대한 결과만을 얻는 이유는 그것이 가상의 상속이 해결할 수있는 유일한 문제이기 때문입니다. 차이점은 DDoD에서 가장 많이 파생 된 클래스에 있습니다. – rightfold
구현 상 (예 : vtable) 외에 일반 상속과 가상 상속 사이에는 아무런 차이가 없다는 말입니까? – NPS