virtuelle vererbung
-
hi
was macht das da?
class mother { bla }; class child : virtual public mother { blubb };
was ist der unterschied zu "normaler" vererbung? hat es etwas mit der virtualität der member zu tun?
mfg
-
Nein, das hat nichts mit der Virtualität der Member zu tun, das wird erst interessant wenn du über mehrere Ebenen vererbst. Bei normaler Vererbung kannst du die Basisklasse mehrmals in der Hierarchie haben und hast dann entsprechend viele Basis-Teilobjekte, bei virtueller Vererbung hast du nur ein Basis-Teilobjekt.
-
class A{}; class B : virtual public A {}; class C : virtual public A {}; class D : public B, public C {}; // Ein D-Objekt enthält nun nur 1 A-Objekt, statt 2.
-
CStoll schrieb:
Bei normaler Vererbung ...
Was meinst du mit "normaler Vererbung"?
lg
-
Beispiel aus der STD:
class ios { //WhatEver }; class istream : virtual public ios { //WhatEver }; class ostream : virtual public ios { //WhatEver }; class iostream : public istream, public ostream { //WhatEver };
-
Gugelmoser schrieb:
CStoll schrieb:
Bei normaler Vererbung ...
Was meinst du mit "normaler Vererbung"?
lg
Was wohl - Vererbung ohne dieses "virtual"
-
Was mir gerade auffällt:
#include <iostream> using namespace std; class A { public: void fkt() { cout << "A"; } }; class B : public A { public: void fkt() { cout << "BA"; } }; class C : public A { public: void fkt() { cout << "CA"; } }; class D : public B, public C {}; int main() { D d; d.C::A::fkt(); // Error: 'A' is an ambiguous base of 'D' cin.get(); return 0; }
- Wie kann man nun das den A-Teil des C-Objekts ansprechen?
- Wieso sagt der Compiler, dass es 'ambiguous' ist, wo ich doch 'C::' angebe?lg
-
VS2010SP1 beschwert sich bei mir nicht, sollte imho auch richtig sein.
// .... int main() { D d; d.fkt(); // -> ambiguous d.B::fkt(); // -> BA d.C::fkt(); // -> CA d.B::A::fkt(); // -> A d.C::A::fkt(); // -> A d.A::fkt(); // -> ambiguous return 0; }
-
Hier hat der GCC einen Compiler-Bug so wie ich das sehe (Gugelmoser). Und beim Code von diamondofdeath ist es soweit ich weis korrekt (das Erste darf nicht richtig sein und das Letzte auch nicht, da
D
nie direkt vonA
erbt).