Czy w C ++ funkcja jest automatycznie wirtualna, jeśli zastępuje funkcję wirtualną?

Spodziewałbym się tego, jeślifoo jest zadeklarowany w klasieD, ale nie oznaczony jako wirtualny, następujący kod nazwałby implementacjęfoo wD (niezależnie od typu dynamicznegod).

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;
}

Rezultatem powyższego programu jest:

E

questionAnswers(4)

yourAnswerToTheQuestion