2016-08-24 3 views
5

zwei Klassen mit einer gemeinsamen virtuellen Basisklasse Gegeben:C++ virtuelle Vererbung Unterschied

class Base {}; 

class Derived1 : public virtual Base {}; 

class Derived2 : public virtual Base {}; 

Gibt es einen Unterschied zwischen diesen beiden weiteren Klassen abgeleitet ?:

  • class Derived3 : public virtual Base, public Derived1, public Derived2 {}; 
    
  • class Derived3 : public Derived1, public Derived2 {}; 
    

Die erste stammt auch direkt von der virtuellen Basis c Lass, aber ich denke, das hat keine Wirkung, weil es mit Derived1 und Derived2 geteilt wird.

Antwort

2

Sie sagen das Gleiche. Der einzige Unterschied besteht darin, dass, wenn Sie public Derived1 und public Derived2 aus beiden Definitionen von Derived3 entfernt haben, der erste noch von Base erben würde und der zweite nicht.

EDIT: Ich habe nicht sorgfältig darüber nachgedacht, ob es eine seltsame Cross-Casting-Situation gibt, in der die beiden sich auch anders verhalten würden, obwohl ich nicht denke, dass es da ist.

2

Es gibt keinen Unterschied zwischen diesen Beispielen.

In einem komplizierteren Szenario kann jedoch das direkte Vererben einer ansonsten geerbten virtuellen Basis die Reihenfolge der Konstruktion/Zerstörung der Basisklassenunterobjekte ändern.

1

Ich glaube nicht, dass es einen Unterschied im Objektlayout gibt, da die Absicht der virtuellen Vererbung darin besteht, zwei Kopien von Base (oder drei Kopien in Fall 1) zu vermeiden.

So ist der ganze Unterschied in Ihren Absichten und wirklich Lesbarkeit des Codes.