C++虚方法重写

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() 没有被正确地重写,而是调用了 BaseClasses 的方法而不是 SubClasses 的方法?如何满足要求以使其正常工作?
BaseClass::init()
BaseClass::deinit()

@LightnessRacesinOrbit:很抱歉。我没有直接将问题与构造函数和析构函数关联起来,这也许是我没有找到这个问题的原因。 - Niklas R
жҲ‘зҢңжғіиҝҷж ·еҒҡзҡ„еҺҹеӣ жҳҜSubClassзҡ„жһ„йҖ еҮҪж•°еңЁжү§иЎҢж—¶еҸҜд»ҘеҒҮе®ҡBaseClassе·Із»Ҹе®Ңе…Ёжһ„е»әеҘҪдәҶгҖӮжһҗжһ„еҮҪж•°еҗҢзҗҶгҖӮ - Alex Chamberlain
2个回答

5

它们被成功重写了。

但是你从基础构造函数中调用它们,在执行基础构造函数时,对象的派生部分尚不存在。

因此,这主要是一种安全功能,并且是C++标准所规定的。


5

因为你在构造函数内部调用了一个虚方法。在构造基类时,派生类(SubClass)还没有被构造,所以实际上它还不存在。

通常最好避免在构造函数内部调用虚方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接