Mi aspetto che se foo
viene dichiarato nella classe D
, ma non contrassegnato come virtuale, il codice seguente chiamerebbe l'implementazione di foo
in D
(indipendentemente dal tipo dinamico di d
).In C++, una funzione è automaticamente virtuale se sovrascrive una funzione virtuale?
D& d = ...;
d.foo();
Tuttavia, nel seguente programma, questo non è il caso. Qualcuno può spiegarlo? Un metodo è automaticamente virtuale se sovrascrive una funzione virtuale?
#include <iostream>
using namespace std;
class C {
public:
virtual void foo() { cout << "C" << endl; }
};
class D : public C {
public:
void foo() { cout << "D" << endl; }
};
class E : public D {
public:
void foo() { cout << "E" << endl; }
};
int main(int argc, char **argv)
{
E& e = *new E;
D& d = *static_cast<D*>(&e);
d.foo();
return 0;
}
L'uscita del programma di cui sopra è:
E
Lo static_cast è superfluo - 'D & D = * static_cast (&e);' è equivalente a 'D & d = e;' dovuto al cast implicito da E */E & D */D &. –
In C++ 11 l'aggiunta di "override" alla dichiarazione della funzione rende chiaro l'intento di sovrascrivere la funzione della classe base, inoltre attiva un errore dal compilatore nel caso in cui la funzione dichiarata differisca in constness dalla base (qualcosa che possa vi sorprendete nel caso in cui derivate da std :: exception per esempio e dichiarate what() non-const) – Ghita