【问题标题】:Virtual function invocation from constructor从构造函数调用虚函数
【发布时间】:2010-10-05 03:45:27
【问题描述】:

也许我错了,但这似乎是一个非常基本的问题。突然我的继承链停止工作。编写一个小的基本测试应用程序证明是我错了(所以我不能怪编译器)。

我有一个基类,在虚函数中具有默认行为。子类从中派生并更改行为。

#include <iostream>

class Base
{
public:
    Base() { print(); }
    ~Base() {}

protected:
    virtual void print() { std::cout << "base\n"; }
};

class Child : public Base
{
public:
    Child() {}
    ~Child() {}

protected:
    virtual void print() { std::cout << "child\n"; }
};

int main()
{
    Base b;
    Child c;
}

打印出来:

base
base

创建 Child 实例时,为什么要调用 Base::print()?我认为通过使用 virtual 关键字,可以将函数替换为派生类。

我在什么时候让自己感到困惑?

【问题讨论】:

标签: c++ inheritance constructor virtual-functions overriding


【解决方案1】:

虽然您当前的问题是其他人提到的构造函数的虚拟方法调用,但我注意到您没有将析构函数设为虚拟。这通常是一件坏事。在您的情况下,析构函数是 nop,并且没有成员是具有析构函数的对象,...但是如果您的代码发生更改,那么很容易发生坏事。

【讨论】:

  • 是的,我经常遇到忘记将析构函数设为虚拟的问题。感谢您的提醒,但我知道潜在的问题。
【解决方案2】:

您在构造函数中调用了一个虚方法,该方法不起作用,因为子类尚未完全初始化。

另见this StackOverflow question

【讨论】:

  • 哎呀,完全相同的问题,奇怪的是我的搜索中没有出现。如果有人愿意,请随时关闭此问题。
猜你喜欢
  • 2012-01-28
  • 2012-01-27
  • 1970-01-01
  • 2021-10-20
  • 2019-04-19
  • 2013-02-18
相关资源
最近更新 更多