【问题标题】:Calling base class method from derived constructor从派生构造函数调用基类方法
【发布时间】:2011-03-05 17:59:29
【问题描述】:
class Base {
    public:
    Base() {}

    void Foo(int x) {...}
};

class Derived : public Base {
    public:
    Derived(int args) {
        /* process args in some way */

        Foo(result);
    }
};

是否允许在派生类的构造函数中调用基类的方法? 我想这很好,因为 Base 对象应该完全构造,但我想检查一下以防万一。

【问题讨论】:

    标签: c++ constructor methods base


    【解决方案1】:

    是否允许在派生类的构造函数中调用基类的方法?

    是的。请注意virtual 函数。如果从Derived 派生的类覆盖了虚函数,而将Derived 构造为该进一步派生类的子对象,则动态类型始终为Derived,因此不会调用在进一步派生类中覆盖的虚函数。 (顺便说一句,析构函数也是如此。)

    我想这很好,因为 Base 对象应该完全构造,但我想检查一下以防万一。

    你的推理是正确的。

    【讨论】:

      【解决方案2】:

      在以下情况下存在危险:
      1.方法被覆盖
      2.方法调用其他被覆盖的方法

      【讨论】:

      • 这是完全错误的。重载函数和构造函数当然没有问题。你的意思是覆盖吗? (如果是这样,请不要忘记这仅适用于虚函数。)
      • 赞成(以及 sbi 的回答),但您的意思是“覆盖”,而不是“重载”
      • sbi,在 adf88 的辩护中,被覆盖意味着虚拟(否则它是隐藏的,没有被覆盖,并且可能是一个错误)。
      • 尽管答案已被编辑为谈论 overridden 而不是 overloaded,但它仍然没有解释 what “危险”是。它可能会更有帮助。
      • 已更正。我总是把这两个词混为一谈;)
      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 2018-07-21
      • 1970-01-01
      • 2011-05-03
      • 2015-08-18
      • 2018-07-16
      • 2011-09-27
      • 2019-04-19
      相关资源
      最近更新 更多