Ho provato a "riparare" l'esempio in this answer per dimostrare come è possibile chiamare una funzione virtuale pura.Perché non si tratta di una chiamata di pura funzione virtuale?
#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;
}
Ma ottengo alcun errore di runtime here (with C++ 4.9.2), ma l'uscita 3. Ho provato la stessa cosa con Borland C++ 5.6.4, ma ci sto diventando una violazione di accesso. Penso che foo()
debba essere virtuale puro nella chiamata del costruttore della classe base.
Chi ha torto? Dovrei provare più compilatori? Ho ragione nella mia comprensione delle funzioni virtuali?
Non utilizzerei i risultati di un test con Borland C++ per verificare se uno snippet di codice è valido e/o conforme allo standard;) – CoryKramer
@CoryKramer Le funzioni virtuali sono in uso da decenni. – Wolf
Ne sono consapevole, stavo facendo un'osservazione sfacciata su qualcuno che utilizza ancora gli IDE Borland – CoryKramer