2013-01-31 18 views
7

Powiel możliwe:
Calling virtual functions inside constructorsC++ wirtualna metoda przesłanianie

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; 
} 

Dlaczego init() i deinit() nieprawidłowo nadpisane i metody BaseClasses' ar e wywołane zamiast tych SubClasses? Jakie są wymagania, aby to działało?

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

@LightnessRacesinOrbit: Przepraszam za to. Nie skojarzyłem bezpośrednio problemu z konstruktorem i destruktorem, co chyba było przyczyną, dla której nie znalazłem tego pytania. –

+0

Domyślam się, że konstruktor 'SubClass' może założyć, że' BaseClass' jest całkowicie skonstruowany podczas wykonywania. Podobny dla destruktora. –

Odpowiedz

5

Ponieważ wywołujesz metodę wirtualną wewnątrz konstruktora. Podczas konstruowania klasy Base wyprowadzony (SubClass) nie jest jeszcze skonstruowany, więc w rzeczywistości jeszcze nie istnieje.

Zasadniczo należy unikać wywoływania metod wirtualnych wewnątrz konstruktorów.

5

Są one nadpisywane w porządku.

Ale już powoływać je z konstruktora bazowej, a gdy konstruktor bazowy jest wykonywany The pochodzi częścią obiektu jeszcze nie istnieje.

Jest to w dużej mierze funkcja bezpieczeństwa i jest wymagana przez standard C++.

Powiązane problemy