Supongo que si foo
se declara en la clase D
, pero no se marca virtual, entonces el siguiente código llamaría a la implementación de foo
en D
(independientemente del tipo dinámico de d
).En C++, ¿es una función automáticamente virtual si anula una función virtual?
D& d = ...;
d.foo();
Sin embargo, en el siguiente programa, ese no es el caso. ¿Alguien puede explicar esto? ¿Es un método automáticamente virtual si anula una función virtual?
#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;
}
La salida del programa anterior es:
E
La static_cast es superfluo - 'D & d = * static_cast (&e);' es equivalente a 'D & d = e;' debido a la conversión implícita de E */E & a D */D & . –
En C++ 11 al agregar "anular" a la declaración de función deja en claro su intención de anular la función de clase base. También desencadena un error del compilador en caso de que la función que declara difiera en constness de base (algo que pueda sorprenderte en caso de que derives de std :: exception por ejemplo y declares qué() no const) – Ghita