2012-04-10 6 views
1

Ich lerne jetzt die verschiedenen Situationen der Ambiguität in der virtuellen Ableitung auf C++. Aber ich habe einen Fehler von Mehrdeutigkeit in meinem Code und ich verstehe nicht, es Grund ist ...virtuelle Ableitung & Konvertierung mehrdeutig

Hier ist mein Code:

class V { 
    public: 
     int v ; 
}; 

class A { 
    public: 
     int a ; 
}; 

class B : public A, public virtual V { 

}; 

class C : public A, public virtual V { 

}; 

class D : public B, public C { 
    public: 
     void f() ; 
}; 

void g() { 
    D d ; 
    B* pb = &d ; // No Problem 
    A* pa = &d ; // Error: 'A' is ambiguous base of 'D' 
    V* pv = &d ; // No Problem 
} 

Ich verstehe nicht, warum ich zu tun habe Dieser Fehler hat jedoch keine Fehler für die anderen Affektierungen.

Danke :-)

Antwort

2

Das komplett in Fällen von multiple inheritance erwartet wird. Was wir hier haben, ist ein Fall von Diamantvererbung. D hat jetzt zwei Kopien von A, eine von B geerbt und eine von C geerbt. Sie müssen angeben, von welchem ​​von B oder C die Mitglieder von A, die D ausgesetzt sind, stammen.

See: Using C++, how do I correctly inherit from the same base class twice?

Sie sollten erwägen:

  • virtuelle Vererbung:

    class B : public virtual A, public virtual V {...};

    class C : public virtual A, public virtual V {...};

  • compositio Verwendung n als Ausweg aus der Mehrfachvererbung.

Ich schlage vor, das Lesen Solving the Diamond Problem with Virtual Inheritance

+1

Danke. Aber beide sind von A geerbt. Was ist das Problem mit dieser Affektiertheit? Danke – Copernic

+0

@Mehdi - D * kann nicht zwei Instanzen von A erben. Denken Sie darüber nach - wenn A eine öffentliche Eigenschaft "a" enthält, dann haben sowohl B als auch C jeweils eine Eigenschaft "a". Jetzt hat D zwei Eigenschaften "a" - welche sollte der Compiler verwenden? Es kann sie nicht einfach zusammenführen - so einfach ist das nicht. Deshalb kann es nicht kompiliert werden. – Alain

+0

Aaah. Jetzt verstehe ich !! vielen Dank @Alain :) – Copernic