【问题标题】:C++ virtual method overriding [duplicate]C ++虚拟方法覆盖[重复]
【发布时间】:2013-01-15 14:59:30
【问题描述】:

可能重复:
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()

【问题讨论】:

  • @LightnessRacesinOrbit:很抱歉。我没有直接将问题与构造函数和析构函数联系起来,我猜这就是我没有找到这个问题的原因。
  • 我猜理由是SubClass 的构造函数被允许假设BaseClass 在执行时完全被构造。析构函数也类似。

标签: c++ inheritance virtual-functions


【解决方案1】:

它们被覆盖就好了。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 2012-11-28
      • 2021-03-26
      • 2014-08-13
      • 2012-06-04
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多