C++虚方法覆盖

Nik*_*s R 7 c++ inheritance virtual-functions

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

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;
}
Run Code Online (Sandbox Code Playgroud)

为什么init()deinit()没有正确重写和基类的方法被调用,而不是子类的吗?使其有效的要求是什么?

BaseClass::init()
BaseClass::deinit()
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 5

他们被覆盖得很好.

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

所以这是一个很大程度上的安全功能,它是C++标准的强制要求.


Hei*_*bug 5

因为您在构造函数中调用虚方法.在构造Base类时,派生的一个(SubClass)仍然没有构造,所以实际上它仍然不存在.

避免在构造函数中调用虚方法通常是一种很好的做法.