Рассмотрим следующий пример кода:
#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
не выдают ошибки компиляции
по той же причине, что указана в Я понимаю
утверждение выше?. Вызовы в Line2
и Line4
в конечном итоге вызовут только ошибку компоновщика
.
Почему Line3
не выдает ни ошибки компиляции, ни ошибки компоновщика, а только исключение времени выполнения
?
Реальный пример UB, когда виртуальная функция Pure вызывается через конструктор: