Почему конструкторы игнорируют переопределенные виртуальные функции?
Вот пример:
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
если нет ребенка?