Вызов виртуальной функции производного класса из конструктора базового класса?

Я пытаюсь выполнить то же самое, что описано в предыдущем вопросе:

вызов виртуальной функции из базового класса

Но, мой настоящий вопрос:

Что делать, если f() является конструктором в классе Base? Какой g() будет вызываться? Я не знаю, поступаю ли я неправильно, но в моей программе, похоже, все наоборот.

Принимая те же самые переменные из предыдущего вопроса, код, который показывает такие

поведение будет выглядеть так:

Class Base

{   

    Base(){g();};

    virtual void g(){//Do some Base related code;}

};



Class Derived : public Base

{   

    Derived(){};

    virtual void g(){//Do some Derived related code};

};



int main()

{

    Derived newDerived;

    return 0;  

}

Update:

Тханкс к Навену.

Он предоставил мне страницу, содержащую всю соответствующую информацию об этой теме.

Я сообщу вам ссылку здесь:

parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6

Ответы

Ответ 1

Несмотря на то, что это виртуальная функция, базовая версия будет вызвана, так как производный класс еще не полностью сконструирован. Конструктор базового класса вызывается перед конструктором производного класса, поэтому, если вызываемая виртуальная функция должна быть вызвана, это будет с неполностью инициализированным экземпляром - возможный (возможно) рецепт для катастрофы.

Ответ 2

Он будет Base::g(). Смотрите FAQ для объяснения.

Ответ 3

Когда вызывается конструктор базового класса, настраивается только vtable для базового класса, поэтому любые вызовы виртуальных функций будут применяться только к методам базового класса.

Когда вызывается конструктор производного класса, вызов виртуальной функции вызывает переопределение производного класса, если он есть.

Ответ 4

Виртуальный механизм не работает в конструкторах, поэтому, если вы вызываете даже виртуальную функцию из конструктора базового класса, вы всегда будете называть функции только базового класса. Существует несколько причин, по которым виртуальные функции не работают в ctors:

  • Пока в конструкторах объект полностью не создан.
  • вызовы ctors разрешаются только во время компиляции, поэтому на самом деле они не имеют никакой зависимости от времени выполнения, поэтому использование виртуальных функций не требуется.
  • В отличие от других функций ctors и dtors не наследуются, поэтому каждый класс имеет свой собственный набор ctors и dtors, поэтому нет возможности переопределить.