为什么构造函数会忽略覆盖虚函数?

时间:2016-02-24 20:07:11

标签: c++ msvc12

以下是一个例子:

struct parent {
    int a;

    virtual void stuff() { a = 5; } //variant A
    void roundabout() { stuff(); }
    parent() { stuff(); }
};

struct child : parent {
    void stuff() override { a = 6; } //variant B
    child() : parent() {}
};

和用法

child c;  //calls variant A
auto p = reinterpret_cast<parent*>(&c);

c.stuff(); //calls variant B
c.roundabout(); //calls variant B
p->stuff(); //calls variant B
p->roundabout() //calls variant B

所以在构造之后,我从类的内部或外部调用stuff()的方式,没有明确地说明parent :: stuff()我得到了child :: stuff(),正如预期的那样。

一个例外是父类的构造函数仍然调用parent :: stuff(),即使它是由子构造函数触发的。这真的很烦人,因为我必须在构造函数调用的函数中包含额外的逻辑,以使它们按照应有的方式运行。为什么会这样?

1 个答案:

答案 0 :(得分:0)

除非父实例已存在,否则不能存在子实例。所以在父类的构造函数中,不存在子实例。那么,如果没有孩子,你怎么能打电话给child::stuff