Я попытался "восстановить" пример в этом ответе, чтобы продемонстрировать, как можно вызывать чистую виртуальную функцию.
#include <iostream>
using namespace std;
class A
{
int id;
public:
A(int i): id(i) {}
int callFoo() { return foo(); }
virtual int foo() = 0;
};
class B: public A
{
public:
B(): A(callFoo()) {}
int foo() { return 3; }
};
int main() {
B b; // <-- this should call a pure virtual function
cout << b.callFoo() << endl;
return 0;
}
Но я не получаю ошибку времени выполнения здесь (с С++ 4.9.2), но вывод 3. Я пробовал то же самое с Borland С++ 5.6.4, но там я получаю нарушение доступа. Я думаю, что foo()
должен быть чистым виртуальным в вызове конструктора базового класса.
Кто не прав? Должен ли я попробовать больше компиляторов? Я прав в своем понимании виртуальных функций?