3

는 다음과 같은 구조를 고려하십시오. BB와 BBB가 B로 정의 된 f의 재정의 (override)를 사용하고, BBB가 BB에 정의 된 g의 재정의 (override)를 사용하도록 BB와 BBB를 인스턴스화 할 수 있기를 바랍니다.C++ 여러 다이아몬드 상속과 순수 가상 함수

질문 : 상속 관계 BBBBB의 인스턴스를 virtual로 표시해야 ?

상속 다이어그램은 이상적으로 다음과 같이한다 :이 디자인 뒤에

A 
|\ 
| \ 
| \ 
AA B 
| \ | 
| \ | 
AAA BB 
    \ | 
    \ | 
    BBB 

아이디어는 A, AA 및 AAA 증분 기능 수준을 설명하는 인터페이스 있다는 것입니다. B, BB 및 BB는 하나의 대응하는 증분 구현이다. BB가 예를 들어 AA에 필요한 모든 것을 정의하고 B에있는 기능을 갖추고 있기 때문에

+0

을 (가상 상속없이)를, 나는 당신의 모든 다른 생각 질문이 이치에 맞지 않습니다. 세부 사항은 중요하다 –

+0

물론, 나는 함수에 가상 수식어를 의미했다. –

답변

1

A AA AAA은 실제로 인터페이스 일 뿐이며, 구성원이 없으므로 virtaul 상속이 필요하지 않습니다. 인터페이스 만 구현하고 기본 클래스에서 호출하십시오. 인터페이스 A의 B에서 구현 한 것은 BB에서도 구현해야하며 B:pureVirtual()BB입니다. 그렇지 않으면 이렇게되어야합니다.

class A 
{ 
public: 
    virtual void f() = 0; 
}; 
class AA : virtual public A 
{ 
public: 
    virtual void g() = 0; 
}; 
class AAA : virtual public AA 
{ 
public: 
    virtual void h() = 0; 
}; 

class B : virtual public A 
{ 
public: 
    void f() override { } 
}; 
class BB : public B, virtual public AA 
{ 
public: 
    void g() override { } 
}; 
class BBB : public BB, public AAA 
{ 
public: 
    void h() override { } 
}; 

편집 : ('class1' : inherits 'class2::member' via dominance 그럼 당신은 한 번 봐 있어야한다) : 당신이 당신의 클래스 정의의 가상 수정 누락

class A //abstract interface 
{ 
public: 
    virtual void f() = 0; 
}; 
class AA : public A //abstract interface 
{ 
public: 
    virtual void g() = 0; 
}; 
class AAA : public AA //abstract interface 
{ 
public: 
    virtual void h() = 0; 
}; 

class B : public A // implementation class 
{ 
public: 
    void f() override {} 
}; 
class BB : public B, public AA // implementation class 
{ 
public: 
    void g() override {} 
    void f() override { B::f(); } 
}; 
class BBB : public BB, public AAA // implementation class 
{ 
public: 
    void h() override {} 

    void g() override { BB::g(); } 
    void f() override { BB::f(); } 
}; 
+0

그런데'void g() override {BB :: g(); }'는 BB의 오버라이드를 호출하는 g의 오버라이드입니다. 우리는 BB의 BB 정의를 직접 사용한다고 말할 수는 없습니까? 따라서 BBB를 구현하는 사용자는 g를 변경하려고하지 않습니다. –

+0

@MarsyaKaustentein 당신이 할 수있는 다른 것들을'BBB : g()'에 구현하고 싶다면. 'BBB'에'g()와 f()'를 구현하고 싶지 않다면 할 수 없습니다. 왜냐하면 그것은 추상적 인 클래스가 될 것이고 당신은'BBB' 인스턴스를 가질 수 없습니다. –