从派生类构造函数调用基类方法

6
class Base {
    public:
    Base() {}

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

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

        Foo(result);
    }
};

在派生类的构造函数中调用基类的方法是否允许? 我认为这是可以的,因为Base对象应该已经完全构建完成,但为了确保安全起见,我想进行确认。

2个回答

12

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

可以。只需注意 virtual 函数。如果从 Derived 派生的类重写了虚函数,并在将其构造为进一步派生类的子对象时,动态类型始终是 Derived,因此不会调用在进一步派生类中重写的虚函数。 (顺便说一下,析构函数也是如此。)

我想这应该没问题,因为 Base 对象应该已经完全构造好了,但我想再确认一下。

你的推理是正确的。


2

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


2
这是完全错误的。过载函数和构造函数肯定没有问题。你是指“重写”吗?(如果是这样,请不要忘记这仅适用于虚函数。) - sbi
已点赞(以及sbi的回答),但您的意思是“重写”,而不是“重载”。 - tpdi
在adf88的辩护中,overridden意味着virtual(因为否则它会被隐藏,而不是被覆盖,并且可能是一个错误)。 - tpdi
即使答案已经被编辑为讨论“覆盖”而不是“重载”,它仍然没有解释“危险”的具体含义。它可以更有帮助。 - CB Bailey
已更正。我总是混淆这两个词 ;) - adf88
@tpdi:不,它并不意味着那样。在C++中,您可以覆盖非虚函数。这很少有用,但并不意味着是虚函数。 - sbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接