Considere esta situación simple:C++ no se llama en la subclase
A.h
class A {
public:
virtual void a() = 0;
};
B.h
#include <iostream>
class B {
public:
virtual void b() {std::cout << "b()." << std::endl;};
};
C.h
#include "A.h"
#include "B.h"
class C : public B, public A {
public:
void a() {std::cout << "a() in C." << std::endl;};
};
int main() {
B* b = new C();
((A*) b)->a(); // Output: b().
A* a = new C();
a->a(); // Output:: a() in C.
return 0;
}
En otras palabras:
- A es una clase virtual pura .
- B es una clase sin superclase y una función virtual no pura.
- C es una subclase de A y B e invalida la función virtual pura de A.
Lo que me sorprende es la primera salida es decir,
((A*) b)->a(); // Output: b().
Aunque yo llamo una() en el código, b() se invoca. Supongo que está relacionado con el hecho de que la variable b es un puntero a la clase B que no es una subclase de la clase A. Pero aún así el tipo de tiempo de ejecución es un puntero a una instancia de C.
¿Cuál es la regla exacta de C++ para explicar esto, desde un punto de vista de Java, comportamiento extraño?
En pocas palabras: ** B no son de A ** Son totalmente sin relación entre sí, pero su (¡no es bueno usarlo!) El estilo C no le importa de ninguna manera. 'dynamic_cast' recorrerá correctamente su jerarquía. Cuando lanzas tipos de puntero no relacionados, obtienes un comportamiento indefinido. Eso significa que podría pasar cualquier cosa, desde que parezca funcionar hasta hacer explotar tu computadora. – GManNickG
No te olvides de los demonios nasales. –