C++虚拟方法覆盖

C++ virtual method overriding

本文关键字:覆盖 方法 虚拟 C++      更新时间:2023-10-16

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

主.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()没有正确覆盖,并且调用了基类的方法而不是子类的方法?使其工作的要求是什么?

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

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

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

它们被覆盖得很好。

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

因此,这在很大程度上是一项安全功能,并且是由C++标准强制要求的。