CVFCD – Aufrufen von virtuellen Funktionen aus Konstruktoren und dem Destruktor

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu C++-Audits


Beschreibung

Bei einem Konstruktor ist der virtuelle Aufrufmechanismus deaktiviert, weil das Überschreiben aus abgeleiteten Klassen noch nicht ausgeführt wurde. Objekte werden von der Basis aufwärts erstellt ("Basis vor abgeleiteter Klasse"). Deshalb sollten Sie virtuelle Funktionen weder in Konstruktoren noch in Destruktoren verwenden.

Bei der Freigabe wird die abgeleitete Klasse vor der Basisklasse freigegeben. Virtuelle Funktionen verhalten sich also so wie in Konstruktoren. Es werden nur die lokalen Definitionen verwendet und keine überschreibenden Funktionen aufgerufen, um den Kontakt zum (jetzt freigegebenen) abgeleiteten Klassenanteil des Objekts zu vermeiden.

Falsch

 #include <iostream>
 #include <string>
 using namespace std;
 
 class B {
 public:
   B(const string& ss) { cout << "B constructor\n"; f(ss); }
   virtual void f(const string&) { cout << "B::f\n";}
 };
 
 class D : public B {
 public:
   D(const string& ss) :B(ss) { cout << "D constructor\n";}
   void f(const string& ss) { cout << "D::f\n"; s = ss; }
 private:
   string s;
 };
 
 int main() {
   D d("Hello");
 }

Das Programm wird compiliert und ergibt:

B constructor
B::f
D constructor

Siehe auch