Spodziewam się, że jeśli foo
zostanie zadeklarowany w klasie D
, ale nie zostanie oznaczony jako wirtualny, wówczas poniższy kod wywoła implementację foo
w D
(niezależnie od typu dynamicznego d
).W języku C++ funkcja jest automatycznie wirtualna, jeśli zastępuje funkcję wirtualną?
D& d = ...;
d.foo();
Jednak w poniższym programie tak nie jest. Czy ktoś może to wyjaśnić? Czy metoda jest automatycznie wirtualna, jeśli zastępuje funkcję wirtualną?
#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;
}
Wyjście powyższego programu jest:
E
static_cast jest zbędny - 'D-D = * static_cast (&e);' odpowiada 'D & D = E;' powodu utajonego obsady z e */E i do D */D &. –
W C++ 11 dodanie "nadpisania" do deklaracji funkcji powoduje, że jasne jest, że chcesz zastąpić funkcję klasy podstawowej, a także uruchamia błąd z kompilatora, na wypadek gdyby zadeklarowana funkcja różniła się od bazy (coś, co może Zaskakuj cię, gdybyś wywodził się ze std :: exception na przykład i zadeklarował co() nie jest const) – Ghita