【问题标题】:Calling an overridden function from a base class?从基类调用重写函数?
【发布时间】:2011-05-03 15:49:39
【问题描述】:

我的问题可能最好用一个例子来解释。

例如,我有 2 个类:一个基类和一个派生类:

class baseClass
{
public:
    baseClass()
    {
        foo();
    }
    virtual bool foo() { printf("baseClass"); return false;}

};

class derivedClass : public baseClass
{
public:
    bool foo()
    {
        printf("derivedClass");
        return true;
    }

};

当我创建derivedClass 的实例时,baseClass 中的构造函数将被调用,foo() 将从它的构造函数中调用。问题是,基类的构造函数调用了它自己的foo(),而没有被派生类覆盖的覆盖foo()。有没有办法让 baseClass 调用被覆盖的函数,而不是它自己的函数定义?

【问题讨论】:

    标签: c++ overriding derived-class


    【解决方案1】:

    在大多数语言中,这种行为要么是被禁止的,要么是未定义的,这是有充分理由的。

    考虑一下:基类构造函数在子类构造函数之前运行,因此子类定义的任何变量都将未初始化。您确定要在这种情况下调用子类化方法吗?

    最简单的替代方法是在你的超类中定义一个 initialize() 方法,然后记住从你的子类构造函数中调用 initialize()。

    【讨论】:

      【解决方案2】:

      您不应该从构造函数调用虚方法,因为对象尚未完全构造。本质上,派生类还不存在,因此无法调用其方法。

      【讨论】:

      • 感谢您的回答!我现在觉得自己像个白痴,因为我早该知道这一点。谢谢:]
      • 有关使类似事情发生的方法,请参阅 C++ FAQ Lite 23.6:parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6
      • 即使没有虚拟业务,我仍然相信 C++ 的行为与问题中描述的一样。换句话说,如果调用的不是构造函数而是普通的构造后方法,C++ 仍然会从基类() 调用 foo()。我知道这是一个老问题,但你能否修改你的答案来解决这一点?还是我完全错了?
      • @aschepler 的链接好像坏了,我想是导致this FAQ
      猜你喜欢
      • 2011-06-17
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      相关资源
      最近更新 更多