7

可能重复:
在构造函数中调用虚函数

主文件

#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()调用 BaseClasses 的方法而不是 SubClasses 的方法?使它工作的要求是什么?

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

2 回答 2

5

他们被覆盖就好了。

但是您已经从基础构造函数调用了它们,并且当基础构造函数正在执行时,对象的派生部分还不存在。

因此,这在很大程度上是一项安全功能,并且是 C++ 标准规定的。

于 2013-01-31T13:34:35.630 回答
5

因为您在构造函数中调用虚拟方法。在构造基类时,派生类(子类)仍未构造,因此实际上它并不存在。

避免在构造函数中调用虚方法通常是一个好习惯。

于 2013-01-31T13:34:57.437 回答