Чистый вызов виртуальной функции из базового ктора
Рассмотрим следующий пример кода:
#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 через конструктор: