Чистый вызов виртуальной функции из Base Ctor

Рассмотрим следующий пример кода:

#include <iostream>

using namespace std;

class base
{
   public:
      base()
      {
         bar(); //Line1
         this->bar(); //Line2
         base *bptr = this; 
         bptr->bar(); //Line3
         ((base*)(this))->bar(); //Line4
      }

      virtual void bar() = 0;
};

class derived: base
{
   public:
      void bar()
      {
         cout << "vfunc in derived class\n";
      }
};

int main()
{
   derived d;
}

В приведенном выше коде есть чистая виртуальная функция bar () в базовом классе, которая переопределяется в производном классе. Чистая виртуальная функция bar () не имеет определения в базовом классе.

Теперь сосредоточьтесь на Line1 , Line2 , Line3 и Line4 .

Я понимаю : Line1 выдает ошибку компиляции, потому что чистая виртуальная функция не может быть вызвана из ctor.

Вопросы:

  1. Почему Line2 и Line4 не выдают ошибки компиляции по той же причине, что указана в Я понимаю утверждение выше?. Вызовы в Line2 и Line4 в конечном итоге вызовут только ошибку компоновщика .

  2. Почему Line3 не выдает ни ошибки компиляции, ни ошибки компоновщика, а только исключение времени выполнения ?

Реальный пример UB, когда виртуальная функция Pure вызывается через конструктор:

Real-Life example of UB when Pure virtual function call through constructor

5
задан Alok Save 9 February 2012 в 15:23
поделиться