Angenommen, es gibt zwei unveränderliche Klassen aus einer Bibliothek, A
und B
, bezogen wie hier:Wie erbt man privat vom Derivat einer Basisklasse, implementiert aber die öffentliche Schnittstelle der Basisklasse?
class A
{
public:
virtual void doCustomThings() = 0;
virtual void doOtherThings() = 0;
void doSomething();
private:
SomeType1 someData;
};
class B : public A
{
public:
void doCustomThings() override;
void doOtherThings() override;
void someUsefulUtility();
private:
SomeType2 otherData;
};
Ich versuche, die Schnittstelle von A
in Bezug auf die einig in B
zur Verfügung zu implementieren, so dass ich tun:
class C : public B
{
public:
void doCustomThings() override; // uses B::someUsefulUtility()
// leave B::doOtherThings() not overridden
private:
SomeType3 myData;
};
Aber ich beabsichtige nicht, C
-B
sein, dh ich will nicht Verweis auf C
-0 implizit konvertierbar sein, obwohl es in A&
umwandelbar sein sollte.
Das erste, was mir in den Sinn kommt, ist die virtuelle Vererbung, und dann erben public A, private B
. Aber die A
und B
Klassen in meinem Fall sind nicht editierbar, und für die virtuelle Vererbung, um hier zu arbeiten, muss ich class B
erben als public virtual A
.
Eine andere Idee ist, Zusammensetzung statt Vererbung in Betracht zu ziehen. Aber wenn ich von A
ableite und B
als ein privates Mitglied habe, werde ich nutzlos A::someData
zweimal haben, was unelegant aussieht.
Gibt es einen guten Weg, so etwas wie class C : public A, private B
, so dass es nur eine Basisklasse A
geben würde, angesichts der oben genannten Einschränkungen?
_But I C nicht die Absicht, B_ sein <- Haben Sie C wollen ein ... zu sein? – skypjack
@skypjack Ja, ich möchte 'C' implementieren' A's virtuelle Methoden. – Ruslan
Da B ein A ist, warum ist es wichtig, ob C zu B konvertiert? Es wird auch in A umwandelbar sein, da B ein A. – ttemple