7

重複の可能性:
コンストラクター内で仮想関数を呼び出す

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()ず、SubClassesのメソッドの代わりにBaseClassesのメソッドが呼び出されるのですか?それを機能させるための要件は何ですか?

BaseClass::init()
BaseClass::deinit()
4

2 に答える 2

5

それらはうまくオーバーライドされます。

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

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

于 2013-01-31T13:34:35.630 に答える
5

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

一般に、コンストラクター内で仮想メソッドを呼び出さないようにすることをお勧めします。

于 2013-01-31T13:34:57.437 に答える