Ist eine Funktion in C ++ automatisch virtuell, wenn sie eine virtuelle Funktion überschreibt?
Ich würde das erwarten, wennfoo
wird in der Klasse deklariertD
, aber nicht als virtuell markiert, würde der folgende Code die Implementierung von aufrufenfoo
imD
(unabhängig vom dynamischen Typ vond
).
D& d = ...;
d.foo();
Im folgenden Programm ist dies jedoch nicht der Fall. Kann mir jemand das erklären? Ist eine Methode automatisch virtuell, wenn sie eine virtuelle Funktion überschreibt?
#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;
}
Die Ausgabe des obigen Programms ist:
E