Im Lesen this Artikel über Konstruktoren für C++C++ virtuelle Funktion in Konstruktor
Wir empfehlen, dass Sie vorsichtig sein, wenn Sie virtuelle Funktionen in Bauer nennen. Da der Basisklassenkonstruktor immer vor dem abgeleiteten Klassenkonstruktor aufgerufen wird, ist die Funktion, die in der Basiskonstruktor aufgerufen wird, die Basisklassenversion, nicht die abgeleitete Klasse Version. Im folgende Beispiel wird die Konstruktion eines DerivedClass verursacht Die Basisklasse Umsetzung print_it() auszuführen, bevor der DerivedClass Konstruktor die DerivedClass Umsetzung print_it Ursachen() auszuführen:
das Beispiel:
class BaseClass {
public:
BaseClass() {
print_it();
}
virtual void print_it() {
cout << "BaseClass print_it" << endl;
}
};
class DerivedClass : public BaseClass {
public:
DerivedClass() {
print_it();
}
virtual void print_it() {
cout << "Derived Class print_it" << endl;
}
};
int main() {
DerivedClass dc;
}
Hier ist der Ausgang:
BaseClass print_it
Derived Class print_it
I tried this code and the output is as stated above. Allerdings habe ich versucht, auch das gleiche Beispiel ohne das virtuelle Stichwort:
class BaseClass {
public:
BaseClass() {
print_it();
}
void print_it() {
cout << "BaseClass print_it" << endl;
}
};
class DerivedClass : public BaseClass {
public:
DerivedClass() {
print_it();
}
void print_it() {
cout << "Derived Class print_it" << endl;
}
};
int main() {
DerivedClass dc;
}
Worin besteht der Unterschied und wovor warnen sie?
@marked als Duplikat:
Diese Frage ist anders als die consturctors beide anstelle eines Konstruktor die virtuelle Methode aufrufen, die virtuelle Methode aufrufen.
Die Gefahr ist: in Konstruktoren und Destruktoren sind virtuelle Funktionen nicht (virtuell das ist). –
Nicht ganz korrekt. Sie sind virtuell, aber wenn ein Konstruktor ausgeführt wird, * ist dies eine Instanz der Klasse des laufenden Konstruktors und keine Instanz der Klasse, zu der sie letztendlich gehört. Also, welcher Konstruktor ausgeführt wird, kann überraschend sein. – gnasher729
@ gnasher729 könntest du erklären, was ich erwarten sollte, weil ich dieses Ergebnis erwartet habe und die Gefahr nicht sehe. Nicht zu wissen, was andere erwarten, könnte zu Missverständnissen führen. –