2013-01-31 10 views
7

可能な重複オーバーライド:init()deinit()適切にオーバーライドし、BaseClasses'メソッドされていないのはなぜ
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; 
} 

をar SubClassesの代わりに呼ばれるe?それを動作させるための要件は何ですか?

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

@ LightnessRacesinOrbit:申し訳ありません。私はこの問題をコンストラクタとデストラクタに直接関連付けることはしませんでした。私はこの疑問を見つけませんでした。 –

+0

私は、 'SubClass'のコンストラクタは、' BaseClass'が実行時に完全に構​​築されていると想定することが許されていると考えています。デストラクタに似ています。 –

答えて

5

コンストラクタ内で仮想メソッドを呼び出すためです。 Baseクラスを構築する際、派生クラス(SubClass)はまだ構築されていないので、実際には存在しません。

コンストラクタ内で仮想メソッドを呼び出さないようにするのが一般的です。

5

これらは上書きされます。

しかし、あなたは基本コンストラクタからそれらを呼び出してきた、と基本コンストラクタが実行されたときに、オブジェクトの派生一部がまだ存在していません。

これは主に安全機能であり、C++標準で義務づけられています。

関連する問題