2016-07-04 6 views
0

In C++ erfordert die Übernahme eines gemeinsamen Vorfahren und das Erben einer Schnittstelle (und die Definition einer Methode in abgeleiteten Klassen) eine mehrfache Vererbung? Z.B. kann ich die folgenden Punkte (statt Zusammenführung MyInterface und ParentClass) zu tun haben:C++: Sind gemeinsame Abstammung und eine Schnittstelle/Prototyp sich gegenseitig ausschließende Funktionen einer C++ - Klasse?

class MyInterface; 
class ParentClass; 
class DerivedClass1; 
class DerivedClass2; 
class SomeOtherType; 
class YetAnotherType; 

class MyInterface { 
    public: 
    // Must be defined in all derived classes 
    virtual SomeOtherType my_common_fxn(...) = 0; 
    ... 
}; 

class ParentClass { 
    private: 
    // Common ancestor 
    YetAnotherType _useful_member; 
} 

class DerivedClass1 : MyInterface, ParentClass { 
    public: 
    // Do some things with _useful_member, using approach #1 
    SomeOtherType my_common_fxn(...); 
    ... 
} 

class DerivedClass2 : MyInterface, ParentClass { 
    public: 
    // Do some things with _useful_member, using approach #2 
    SomeOtherType my_common_fxn(...); 
    ... 
} 

void fxn_or_method_using(ParentClass); 

Ist es möglich, (elegant) verschmelzen die Funktionalität von MyInterface und ParentClass in einer einzigen Klasse? (Ich glaube, dass als MyInterface ist ein ABC Ich kann diesen Typ nicht als Parameter zu fxn_or_method_using verwenden.)

Entschuldigung im Voraus, wenn dies ein Duplikat ist- Ich habe gesucht, aber keine der vorhandenen C++ Fragen erschien zu richten. Q's und/oder A's waren vielleicht über meinem (untrainierten) Kopf.

+4

Ich bekomme die Frage nicht. Erstens: Warum wäre Mehrfachvererbung hier schlecht? Zweitens: Warum darf ParentClass MyInterface nicht einfach erben lassen? Wenn Sie von einem Java-Hintergrund kommen: Es gibt keine Schnittstelle in C++. Sie können virtuelle Funktionen als 0 deklarieren, wodurch die Klasse abstrakt wird, aber das bedeutet nicht, dass Sie keine definierten Funktionen darin einfügen können. I.e. Sie können my_common_fxn mit dieser Deklaration in ParentClass einfügen. –

+2

'fxn_or_method_using' muss seinen Parameter durch Referenz nicht Wert nehmen, und dann können Sie es als Bezug auf' MyInterfsce' deklarieren, wenn Sie möchten. –

+0

@Klemens 1. Ich habe kein Problem mit Mehrfachvererbung - in der Tat ist mein Code derzeit implementiert. Ich suche etwas "Eleganteres" mit einer einzigen Erbschaft, also werde ich nicht auf Probleme stoßen, die beide vergessen. – mvs

Antwort

2

Es ist nichts falsch mit Ihrem Vererbungsmodell.

Aber in C++ brauchen Sie einen Zeiger oder eine Referenz für Polymorphie. Ihr fxn_or_method_using nimmt seinen Parameter nach Wert. Das hat mehrere Probleme. Es verursacht Slicing, es verhindert polymorphe Funktionsaufrufe, und es kann nicht für einen abstrakten Typ arbeiten, weil Sie Instanzen davon nicht erstellen können.

Wenn Sie fxn_or_method_using ändern, um seinen Parameter als Referenzwert zu verwenden, können Sie ihn auf MyInterface beziehen, wenn Sie dies wünschen. Alle Nachteile verschwinden und Sie erhalten das gewünschte polymorphe Verhalten.

+0

Danke Alan - funktioniert wie ein Zauber! – mvs

0

Nein. Sie können virtuelle und reine virtuelle und konkrete Vererbung alle aus der gleichen Klasse in C++ ohne Probleme mischen.

class baseClass{ 

public: 
    blah1(){ 
    //stuff 
} 
    virtual blah2(); 

    virtual blah3() = 0; 

}; 

class derivedClass : baseClass 
{ 


}; 
Verwandte Themen