Lassen Sie uns die folgende Klasse betrachten erweitert werden:
struct A {
int x, y;
A(int x, int y) : x(x), y(y) {}
};
Sie können von dieser Klasse erben oder eine Wrapper-Klasse schreiben, die eine Instanz dieser Klasse enthält. In den meisten Fällen ist die Vererbung der Weg zu gehen, als Wrapper-Klasse ein A nicht ist, aber es wickelt (enthält) einen A.
Mit C++ 11 bewegen Semantik, eine Instanz zu fördern A
zu eine Unterklasse B
(vererben A
) effizient sein und erfordert nicht die Instanz A
zu kopieren:
class B : public A {
public:
B (A &&a) : A(a), someOtherMember(a.x + a.y) {}
// added public stuff:
int someOtherFunction() const { return someOtherMember; }
private:
// added private stuff:
int someOtherMember;
};
Voll Code mit Beispiel: http://ideone.com/mZLLEu
natürlich ist die Funktion, die ich hinzufügen ed ist ein bisschen albern (und das Mitglied noch mehr, da es weitere Änderungen der ursprünglichen Mitglieder x
und y
nicht respektiert), aber Sie sollten eine Vorstellung davon bekommen, was ich demonstrieren möchte.
Beachte den Konstruktor B (A &&a)
was ich "promotion constructor" nenne (dies ist kein Standardbegriff). Normalerweise ist B (B &&b)
ein Move-Konstruktor, der verschiebt den Inhalt der bereitgestellten B
Instanz in eine neue B
über gebaut werden. Ich benutze die Bewegung Semantik zu Bewegung eine Instanz von A
(die von einer anderen Funktion zurückgegeben wurde) in der Super-Klasse A
von B
.
Effektiv können Sie A
zu B
fördern, während es möglich ist, eine B
als A
zu verwenden.
Im Gegensatz zu Soontts 'Antwort funktioniert meine Lösung auch mit hinzugefügten virtuellen Tabellen, da sie nicht auf unsicheren Pointer-Casting angewiesen ist.
Ja, Wenn Sie den Zugriff auf die Klassendefinition haben. Nein, sonst. –
Zur Laufzeit erhalten Sie keine Sprachunterstützung dafür. Sie können jedoch z. eine Karte mit Funktionszeigern. Aber das ist dann eher umständlich und fehleranfällig. –
@AlokSave Meinen Sie, den Quellcode direkt zu ändern? Es könnte eine Option sein. – Eonil