2016-05-15 16 views
0

Wie funktioniert die Mehrfachvererbung bei Verwendung der virtuellen Basisklasse? Wie wissen wir, wann und wo wir die virtuelle Basisklasse verwenden sollten?Wie funktioniert die Mehrfachvererbung bei Verwendung der virtuellen Basisklasse?

Für den folgenden Code, wie erhalten wir den Ausgang?

class A { 
    public: 
     A() { 
      cout<<"\t A"; 
     } 
}; 

class B: public A { 
    public: 
     B() { 
      cout<<"\t B"; 
     } 
}; 

class C: public B { 
    public: 
     C() { 
      cout<<"\t C"; 
     } 
}; 

class D: virtual C { 
    public: 
     D() { 
      cout<<"\t D"; 
     } 
}; 

class E: virtual C, virtual D { 
    public: 
     E() { 
      cout<<"\t E"; 
     } 
}; 

class F: public B, virtual E { 
    public:  
     F() { 
      cout<<"\t F"; 
     } 
}; 

int main() { 
    F obj; 
} 

Die Ausgabe lautet:

 A  B  C  D  E  A  B  F 

ich die Warnung [Warnung] direkte Basis 'B' unzugänglich in 'F' aufgrund Mehrdeutigkeit [standardmäßig aktiviert]

Wie Ich korrigiere es?

+0

Ich würde ein Redesign –

+2

Welche Ausgabe zunächst prüfen wollen Sie bekommen? Wie man es "korrigiert" hängt davon ab, was Sie erreichen möchten. – interjay

+1

Die virtuelle Vererbung gilt nur ab der Ebene, in der sie zuerst eingeführt wurde. Da weder 'C' noch' D' virtuell erben, erhalten Sie immer noch doppelte Basen und Mehrdeutigkeiten, wenn Sie von beiden (sogar virtuell) erben. – StoryTeller

Antwort

2

Sie virtual in den folgenden Erklärungen verpasst haben (siehe Kommentar von Story Teller):

class B: public virtual A {...}; 
class C: public virtual B {...}; 
class F: public virtual B, virtual E {...}; 

Hier ist die Demo: http://cpp.sh/6k2be

Verwandte Themen