Estoy tratando de entender un punto aquí en C++. Si la clase A tiene un método no virtual, y la clase B, que se extiende A, anula ese método, ¿puedo crear una instancia de B y de alguna manera usar el método definido en B? ¿Hay algún punto para anular un método no virtual?¿Puedo usar un método que anule un método no virtual?
Respuesta
¿Hay algún punto para anular un método no virtual?
en realidad no son de primer orden, pero esto es el comportamiento, es decir
B* b = new B();
A* a = new B();
b->method(); //Calls B's method
a->method(); // Calls A's method
Por lo tanto, el tipo de puntero/referencia determina el método llamado.
¿puedo crear una instancia de B y de alguna manera usar el método definido en B?
Sí. El puntero/tipo de referencia debe ser del tipo B. (ver ejemplo anterior).
Si no se declara method
ser virtual
, no se puede anulación, pero se puede ocultar ella.
Gran respuesta, gracias – Eyal
Una "gotcha" es la situación cuando 'A' a su vez se deriva de alguna clase base (o implementa una interfaz) que declara 'método virtual()', en cuyo caso el método 'a->() 'de hecho llamará a' B.method() '... – BadCash
@Chip Se le olvidó resaltar la diferencia. Esta respuesta solo está completa con el comentario de BadCashs. – ManuelSchneid3r
Si B
hereda de A
, y redefine un método definido en A
, a continuación, nuevas instancias de B
llamarán versión B
's. Sin embargo, si el método no es virtual, entonces no hay comportamiento polimórfico, por lo que si se hace referencia a una instancia de B
como A
, entonces el método será A
. Por ejemplo:
struct A {
void foo() { std::cout << "A::foo" << std::endl; }
};
struct B : public A {
void foo() { std::cout << "B::foo" << std::endl; }
};
B b;
b.foo();
A *a = &b;
a->foo();
La salida del código anterior sería:
B::foo
A::foo
Sin embargo, si el método de foo
había sido virtual, entonces B::foo
habría sido impresa dos veces.
¡Bien escrito! :) – niknak
Si una función no es virtual
entonces el tipo de la variable determina que la aplicación se envía demasiado:
#include <iostream>
using namespace std;
struct A {
void f() { cout << "A" << endl; }
};
struct B : public A {
void f() { cout << "B" << endl; }
};
int main(int args, char** argv) {
B b;
A& a = b;
b.f();
a.f();
return 0;
}
- No, no existe un mecanismo para anular un método no virtual en la clase A.
- sí, se puede utilizar un método no virtual de la clase a en B sobrecargada usando el operador de resolución de ámbito un :: methodName
- 1. ¿Puedo evitar que un método virtual heredado se anule en subclases?
- 2. Cómo evitar que se anule un método en C#
- 3. ¿Es posible anular un método no virtual?
- 4. ¿Cómo se diferencia la sobrecarga de un método virtual de un método no virtual?
- 5. Método virtual que no se llama
- 6. ¿Podemos tener un método estático virtual? (C++)
- 7. ¿Por qué no puedo editar un método que contiene un método anónimo en el depurador?
- 8. ¿Sobrescribe un método virtual no const ocultar una sobrecarga const?
- 9. ¿Método abstracto o virtual?
- 10. método virtual puro Llamado
- 11. C# Método que ejecuta un Método dado
- 12. Creo que he redefinido un método virtual pero sigo obteniendo: "X debe implementar el método virtual puro heredado Y"
- 13. Decorar un método que ya es un método de clase?
- 14. Mock método C no virtual ++ (gmock)
- 15. detectar que un método no fue anulada
- 16. Declaración de método abstracto - virtual?
- 17. Llamar a un método asíncrono de un método no asíncrono
- 18. Buscar la implementación original de un método virtual
- 19. Configuración de Moq para ignorar un método virtual
- 20. ¿Cómo implementar una interfaz explícitamente con un método virtual?
- 21. ¿Puedo usar SuppressMessage en un método de framework?
- 22. Método virtual privado en C++
- 23. no puedo compilar método
- 24. ¿Cómo puedo pasar un método adquirido por reflexión en C# a un método que acepta el método como delegado?
- 25. ¿Cómo puedo llamar a un método no estático desde un método estático en C#?
- 26. ¿Por qué no puedo llamar a un método privado cuando estoy dentro de un método público?
- 27. anotación que invoca un método
- 28. Llamar a un método miembro no estático desde otro método
- 29. Delphi: ¿Cómo llamar antecesor heredado heredado en un método virtual?
- 30. ¿Para qué sirve la invocación de un método virtual Java?
Lo que describes se llama * ocultar *, no anula. Mire aquí, por ejemplo: http://stackoverflow.com/questions/2161462/c-inheritance-and-function-overriding – jrok