Почему конструкторы игнорируют переопределенные виртуальные функции?

Вот пример:

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, который по-прежнему вызывает parent::stuff(), даже если он вызывается дочерним конструктором. Это действительно довольно раздражает, так как я должен включить дополнительную логику в функции, которые вызывают конструкторы, чтобы заставить их вести себя как надо. Почему это так?

1 ответ

Экземпляр child не может существовать, если только экземпляр parent не существует. Таким образом, в конструкторе parent не может существовать экземпляр child. Так как вы могли бы позвонить child::stuff если нет ребенка?

Другие вопросы по тегам