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

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

#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.

Вопросов:

ПочемуLine2 а такжеLine4 не даватьcompilation error по той же причине, упомянутой вI understand утверждение выше? Звонки вLine2 а такжеLine4 в конечном итоге вызоветlinker-error только.

ПочемуLine3 не дает ни ошибки компиляции, ни ошибки компоновщика, но даетrun-time exception только ?

Пример из реальной жизни UB при вызове виртуальной функции Pure через конструктор:

Ответы на вопрос(6)

Ваш ответ на вопрос