Я попытался «восстановить» пример в this answer, чтобы продемонстрировать, как можно вызывать чистую виртуальную функцию.Почему это не вызов чистой виртуальной функции?
#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;
}
Но я не получаю сообщение об ошибке выполнения here (with C++ 4.9.2), но выход 3. Я попробовал то же самое с Borland C++ 5.6.4, но я получаю сообщение о нарушении прав доступа. Я думаю, что foo()
должен быть чистым виртуальным в вызове конструктора базового класса.
Кто не так? Должен ли я попробовать больше компиляторов? Я прав в своем понимании виртуальных функций?
Я бы не использовал результаты теста с Borland C++, чтобы убедиться, что код кода действителен и/или соответствует стандарту;) – CoryKramer
@CoryKramer Виртуальные функции используются уже несколько десятилетий. – Wolf
Мне это известно, я делал дерзкое замечание о том, что кто-то все еще использует Borland IDE – CoryKramer