2013-01-31 197 views
7

可能重複:
Calling virtual functions inside constructorsC++虛擬方法覆蓋

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

爲什麼init()deinit()沒有正確重寫和基類的方法AR電子而不是子類的?有什麼要求使它工作?

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

@LightnessRacesinOrbit:對不起。我沒有直接將這個問題與構造函數和析構函數關聯起來,我想這就是爲什麼我沒有找到這個問題。 –

+0

我想說的理由是,允許'SubClass'的構造函數假定'BaseClass'在執行時完全構造。類似於析構函數。 –

回答

5

因爲您在構造函數中調用虛擬方法。在構造Base類時,派生的類(SubClass)不是仍然構造的,所以實際上它不存在。

避免在構造函數中調用虛擬方法通常是一種很好的做法。

5

它們被覆蓋就好了。

但是你從基構造函數調用他們,當基類的構造執行時,派生的對象一部分尚不存在。

所以這在很大程度上是一個安全功能,它的要求是C++標準。