C ++虚方法覆盖

时间:2013-01-31 13:32:10

标签: c++ inheritance virtual-method

  

可能重复:
  Calling virtual functions inside constructors

的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()

2 个答案:

答案 0 :(得分:5)

他们被覆盖得很好。

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

所以这是一个很大程度上的安全功能,它是C ++标准规定的。

答案 1 :(得分:5)

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

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