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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage