viruelle basisklasse, konstruktor frage
-
Bei unten stehender ClassC ist ein Konstruktor zu ergänzen, der einen int Parameter nimmt und dafür sorgt, dass alle Basisklassen mit diesem Parameterwert als Initialwert konstruiert werden.
class ClassA { public : ˜ClassA ( ) { cout << " cadtor " ; } ClassA( int init ) { cout << " cactor " << init ; } }; class ClassB : public virtual ClassA { public : ˜ClassB ( ) { cout << " cbdtor " ; } ClassB( int init ) : ClassA( init ) { cout << " cbctor " << init ; } }; class ClassC : public ClassB { public : ˜ClassC ( ) { cout << " ccdtor " ; } };
wie funktioniert das? welche lösungen habt ihr? in welcher reigenfolge werden die konstruktoren dann aufgerufen?
cu
-
class ClassA { public : ~ClassA ( ) { cout << " cadtor " ; } ClassA( int init ) { cout << " cactor " << init ; } }; class ClassB : public virtual ClassA { public : ~ClassB ( ) { cout << " cbdtor " ; } ClassB( int init ) : ClassA( init ) { cout << " cbctor " << init ; } // hier steht eigentlich schon die lösung }; class ClassC : public ClassB { public : ClassC(int i) : ClassB(i) {} ~ClassC ( ) { cout << " ccdtor " ; } };
wie funktioniert das? welche lösungen habt ihr? in welcher reigenfolge werden die konstruktoren dann aufgerufen?
Parent Members
Parent
Derived Members
Derived#include <iostream> using std::cout; class Member { public: Member() { cout << "Member::Ctor\n"; } }; class Parent { public: Parent() { cout << "Parent::Ctor\n"; } private: Member m_; }; class Derived : public Parent { public: Derived() { cout << "Derived::Ctor\n"; } private: Member m_; }; int main() { Member m; cout << "\n"; Parent p; cout << "\n"; Derived d; return 0; }
mfg
-
terraner schrieb:
class ClassA { public : ~ClassA ( ) { cout << " cadtor " ; } ClassA( int init ) { cout << " cactor " << init ; } }; class ClassB : public virtual ClassA { public : ~ClassB ( ) { cout << " cbdtor " ; } ClassB( int init ) : ClassA( init ) { cout << " cbctor " << init ; } // hier steht eigentlich schon die lösung }; class ClassC : public ClassB { public : ClassC(int i) : ClassB(i) {} ~ClassC ( ) { cout << " ccdtor " ; } };
Das ist käse. Virtuelle Basisklassen müssen *immer* von der am weitesten abgeleiteten Klasse initialisiert werden (im Gegensatz zu normalen Basisklassen, die immer von ihrem direkten Nachfolger initialisiert werden).
Im Beispiel ist die am weitesten abgeleitete Klasse Class C, deshalb muss der Ctor von ClassC so aussehen:ClassC(int i) : ClassA(i), ClassB(i) {}
Der Initialisierungscode der virtuellen Basisklasse in "mittleren"-Klassen wird in diesem Fall automatisch übersprungen.