secretos secreto para oculto infidelidad icono gratis descubrir corazon con chatear casados app aplicaciones aplicacion amantes c++ virtual hide

c++ - secreto - ¿Por qué se oculta una función virtual?



app para descubrir infidelidad gratis (6)

Tengo las siguientes clases:

class A { public: virtual void f() {} }; class B : public A{ public: void f(int x) {} };

Si yo digo

B *b = new B(); b->f();

el compilador dice error C2660: la función ''B :: f'': no ​​toma 0 argumentos. ¿No debería la función en B sobrecargarla, ya que es una función virtual? ¿Las funciones virtuales se ocultan así?

EDITAR : De hecho, quería heredar B de A, que muestra el mismo comportamiento.


B no deriva de A, la declaración correcta es:

class B : public A


Cuando el compilador tiene más de una forma de resolver un símbolo, tiene que elegir cuál tiene prioridad a menos que el código le indique lo contrario. Lo que está esperando es que la sobrecarga tenga prioridad sobre la anulación. (sobre, sobre, sobre, aaaaack! Lo siento, me ''abrumé'').

Este ejemplo tiene a B heredando un método virtual en el que la subclase proporciona una versión sobrecargada. Las sobrecargas son para métodos en la misma clase que usan el mismo nombre de método pero firmas diferentes. Dado que B es una subclase de A, está anulando f (), lo que significa que no puede ser una sobrecarga al mismo tiempo. Es por esto que está siendo escondido.

Para la clase A, método de declaración.

virtual void f() {}

como virtual significa que el método se resolverá usando un cierto conjunto de reglas que no son consistentes con su declaración de b.

B *b = new B();

Al crear ''b'' como una instancia de "B", el compilador no tiene necesidad de usar la naturaleza virtual del método del mismo nombre en "A".

Si hubieras declarado ''b'' así

B *b = new A();

entonces la llamada b-> f (); De hecho, se referiría al método en A haciendo uso de la resolución virtual.


La clase B no deriva de A, por lo que no existe la función F (). Probablemente quiso decir:

class A { public: virtual void f() {} }; class B : public A { public: void f(int x) {} };

Edición: me perdí la función real de ocultar. Vea la respuesta de Steve Jessop para una explicación más completa.


No, y sí, respectivamente. Si desea el comportamiento de sobrecarga, necesita decir

using A::f;

en B.


Parece que es una pregunta bastante similar con respuesta en las preguntas frecuentes de Biern Stroustrup: http://www.stroustrup.com/bs_faq2.html#overloadderived

Como él dijo:

"En C ++, no hay sobrecarga en todos los ámbitos"

pero si quieres

"Eso es fácil de hacer usando una declaración de uso"


Suponiendo que pretendes que B derive de A :

f(int) y f() son firmas diferentes, por lo tanto, diferentes funciones.

Puede anular una función virtual con una función que tenga una firma compatible, lo que significa una firma idéntica o una en la que el tipo de retorno sea "más específico" (esto es covarianza).

De lo contrario, su función de clase derivada oculta la función virtual, como cualquier otro caso en el que una clase derivada declara funciones con el mismo nombre que las funciones de clase base. Puedes poner using A::f; en la clase B para mostrar el nombre

Alternativamente, puede llamarlo como (static_cast<A*>(b))->f(); , o como b->A::f(); . La diferencia es que si B realmente anula f() , entonces el primero llama al reemplazo, mientras que el último llama a la función en A independientemente.