2013-01-31 13 views
7

Mögliche Duplizieren:
Calling virtual functions inside constructorsC++ virtuelle Methode überschrieben

main.cpp

#include <iostream> 

class BaseClass { 

    public: 

    BaseClass() { 
     init(); 
    } 

    virtual ~BaseClass() { 
     deinit(); 
    } 

    virtual void init() { 
     std::cout << "BaseClass::init()\n"; 
    } 

    virtual void deinit() { 
     std::cout << "BaseClass::deinit()\n"; 
    } 

}; 

class SubClass : public BaseClass { 

    public: 

    virtual void init() { 
     std::cout << "SubClass::init()\n"; 
    } 

    virtual void deinit() { 
     std::cout << "SubClass::deinit()\n"; 
    } 

}; 

int main() { 
    SubClass* cls = new SubClass; 
    delete cls; 
    return 0; 
} 

Warum init() ist und deinit() nicht richtig außer Kraft gesetzt und die Methoden der Basisklassen ar e rief anstelle der SubClasses ein? Was sind die Voraussetzungen, damit es funktioniert?

BaseClass::init() 
BaseClass::deinit() 
+0

@LightnessRacesinOrbit: Entschuldigung dafür. Ich habe das Problem nicht direkt mit dem Konstruktor und dem Destruktor assoziiert, was vermutlich der Grund war, warum ich diese Frage nicht gefunden habe. –

+0

Ich denke, die Begründung ist, dass "SubClass" -Konstruktor annehmen darf, dass 'BaseClass' vollständig konstruiert ist, wenn es ausgeführt wird. Ähnlich für den Destruktor. –

Antwort

5

Weil Sie eine virtuelle Methode in einem Konstruktor aufrufen. Beim Konstruieren der Base-Klasse wird die abgeleitete Klasse (SubClass) nicht immer konstruiert, so dass sie tatsächlich nicht existiert.

Es ist im Allgemeinen eine gute Übung, den Aufruf virtueller Methoden in Konstruktoren zu vermeiden.

5

Sie sind gut übersteuert.

Aber Sie haben sie aus dem Basiskonstruktor aufgerufen, und wenn der Basiskonstruktor ausgeführt wird, abgeleitet die Teil des Objekts existiert noch nicht.

Dies ist also weitgehend ein Sicherheitsmerkmal, und es ist durch den C++ - Standard vorgeschrieben.

Verwandte Themen