Program Tip

가상 상속

programtip 2020. 12. 27. 19:57
반응형

가상 상속


이 질문에 이미 답변이 있습니다.

"가상"상속의 의미는 무엇입니까?

다음 코드를 보았고 virtual다음 컨텍스트에서 키워드의 의미를 이해하지 못했습니다 .

class A {};
class B : public virtual A;

가상 상속은 DDD 문제 (Dreadful Diamond on Derivation)를 해결하는 데 사용됩니다.

동일한 기본 클래스에서 상속하는 두 개의 클래스가있는 다음 예제를보십시오.

class Base
{

public:

 virtual void  Ambig();

};

class C : public Base
{

public:

//...

};

class D : public Base
{
public:

    //...

};

이제 C 및 D 클래스 (둘 다 Base :: Ambig () 함수를 상속)에서 상속하는 새 클래스를 작성하려고합니다.

class Wrong : public C, public D
{

public:

...

};

위의 "잘못된"클래스를 정의하는 동안 실제로 다음을 호출 할 수 없기 때문에 DDD (Diamond Derivation 문제)를 생성했습니다.

Wrong wrong;
wrong.Ambig(); 

이것은 두 번 정의되기 때문에 모호한 함수입니다.

Wrong::C::Base::Ambig()

과:

Wrong::D::Base::Ambig()

이러한 종류의 문제를 방지하려면 올바른 Ambig()기능 을 참조하는 가상 상속을 사용해야합니다 .

그래서 정의 :

class C : public virtual Base

class D : public virtual Base

class Right : public C, public D

참조 URL : https://stackoverflow.com/questions/419943/virtual-inheritance

반응형