Virtuelle Vererbung und C'tor-Calls
Verfasst: 26.01.2011, 18:40
Virtuelle Vererbung wird ja meist in Zusammenhang mit Mehrfachvererbung eingesetzt. Hier mal ein Beispiel:
Gehen wir nun mal davon aus, dass jede Klasse einen Konstruktor besitzt, der einen string als Parameter benötigt. Daraus resultiert nun, dass man in der Klasse MitarbeiterUndKunde, den Konstruktor von Person manuell aufrufen muss. Ergibt einen Sinn, da ja nicht klar ist, ob man nun den Person-C'tor-Call von Mitarbeiter oder Kunde nehmen soll. Soweit so gut.
Wenn man nun aber eine neue Klasse einführt (sagen wir mal Chef), die nur von der Klasse Mitarbeiter erbt, so muss scheinbar auch hier der C'tor von Person manuell aufgerufen werden. Ich frage mich nun, ob es einen tieferen Sinn dahinter gibt, oder ob der Compiler einfach nicht schlau genug ist um festzustellen, dass keine Mehrfachvererbung vorliegt und der Person-C'tor-Call aus Mitarbeiter eindeutig ist.
Warum ist das so wichtig? Nun nehmen wir mal an wir haben eine Hierarchy aus vielen Ebenen, die alle nur Einfachvererbung nutzen und irgendwo weit unten in der Hierarchy wurde eine virtuelle Vererbung verwendet. Dann muss man für jede dieser Klassen den Konstruktor von Person aufrufen, wobei man das teilweise lieber den Basisklassen überlassen will.
Gibt es da Lösungen oder plausible Gründe, warum das so gelöst ist? Ist das nicht bei jedem Compiler der Fall? Getestet habe ich das ganze mit dem g++ 4.XX.
Code: Alles auswählen
class Person {
string name;
// ...
};
class Mitarbeiter : public virtual Person { /* ... */ };
class Kunde : public virtual Person { /* ... */ };
class MitarbeiterUndKunde : public Mitarbeiter, public Kunde { /* ... */ };
Wenn man nun aber eine neue Klasse einführt (sagen wir mal Chef), die nur von der Klasse Mitarbeiter erbt, so muss scheinbar auch hier der C'tor von Person manuell aufgerufen werden. Ich frage mich nun, ob es einen tieferen Sinn dahinter gibt, oder ob der Compiler einfach nicht schlau genug ist um festzustellen, dass keine Mehrfachvererbung vorliegt und der Person-C'tor-Call aus Mitarbeiter eindeutig ist.
Warum ist das so wichtig? Nun nehmen wir mal an wir haben eine Hierarchy aus vielen Ebenen, die alle nur Einfachvererbung nutzen und irgendwo weit unten in der Hierarchy wurde eine virtuelle Vererbung verwendet. Dann muss man für jede dieser Klassen den Konstruktor von Person aufrufen, wobei man das teilweise lieber den Basisklassen überlassen will.
Gibt es da Lösungen oder plausible Gründe, warum das so gelöst ist? Ist das nicht bei jedem Compiler der Fall? Getestet habe ich das ganze mit dem g++ 4.XX.