2012-03-18 17 views

Respuesta

6

Cuando se tiene un método de la clase base declarada como virtual, con el fin de anular que es necesario proporcionar una función con exactamente la misma firma en clase derivada (tipos de retorno covarianza se permite sin embargo).

Si el nombre de la función es la misma pero la firma en la clase derivada varía de una clase en la base de lo que no se overidding más, Es function Hiding, el método de clase derivada oculta el método de la clase base.

sobrecarga de funciones no está al otro lado de las clases, puede sobrecargar métodos dentro de la misma clase o funciones gratuitas, pero las clases no encontrado. Cuando intentas hacerlo a través de las clases, lo que finalmente obtienes es ocultar funciones.

Para traer los métodos de la clase base en el alcance de su clase derivada que hay que añadir una
adicional using functionName, a su clase derivada.

EDIT:
En cuanto a la Q de cuándo utilizar virtual durante la sobrecarga, la respuesta es:
Si tiene la intención funciones de su clase para ser anulados por polimorfismo en tiempo de ejecución debe marcarlos como virtual, y no si no tienes la intención de hacerlo.

Buena lectura:
When to mark a function in C++ as a virtual?

+0

Para sobrecargar una función de miembro de clase base en una clase derivada, solo necesita una declaración 'using'. – Potatoswatter

+0

@Potatoswatter: Sí, necesita hacer eso además de solo proporcionar los métodos, en ese sentido es más que solo proporcionar versiones sobrecargadas. –

+0

También estaba tratando de formular una respuesta, pero no podía explicar las diferencias entre hacer una función en la base virtual o no. Puede sobrecargar ambos de la misma manera en una clase derivada (con una firma diferente). Y creo que eso es parte de la pregunta del OP. –

3

La sobrecarga es totalmente independiente de (ortogonales) virtuales primordial.

En la anulación, una función se sustituye por otra de una firma idéntica. A continuación, hay una regla para elegir la función "más importante", que para las funciones virtuales significa la definida en la clase más derivada. Como un caso especial para funciones virtuales, los tipos de devolución de las firmas pueden diferir ligeramente (covarianza).

En la sobrecarga, las firmas de funciones con diferentes tipos de argumentos actúan simultáneamente como candidatos para ser elegidos cuando se realiza una llamada de función. Existe un conjunto de reglas increíblemente complicado para elegir el correcto, que funciona bien el 95% del tiempo y le da dolor de cabeza cuando no coopera.

Dado que la sobrecarga funciona con diferentes firmas y reemplaza trabajos con las mismas firmas, realmente no interfieren entre sí.

Puede importar explícitamente las funciones de una clase base en una clase derivada para extender un nombre de función sobrecargado. Esto se hace por using base_class::overload_name; dentro de la clase derivada.

0

Creo que significaba anular las funciones no virtuales y no sobrecargar. Cuando anula una función de clase base no virtual en la clase derivada, la llamada a la función se resuelve y enlaza en tiempo de compilación. Esto significa que la llamada a la función se resuelve según el tipo (o puntero) en el que se llama a la función. Si está llamando a la función en el puntero de la clase base, entonces se llama siempre a la versión de la clase base. Si usa el puntero de clase derivado, entonces se llama a la versión derivada, siempre; independientemente del objeto real al que apunta. En caso de que la versión de clase base esté marcada como virtual, la resolución de llamada o enlace se difiere en tiempo de ejecución según el tipo de objeto en el que se realiza la llamada y no según el tipo de puntero utilizado. Haz la llamada. Esto significa que puede usar el puntero de la clase base para apuntar a objetos de clase base y derivados y luego llamar a la función. En función del tipo de objeto al que apunta el puntero, se llama a la versión de función respectiva. Esto significa que si mi puntero apunta al objeto de la clase base, entonces se llama a la versión de la clase base. Si el puntero apunta al objeto de tipo derivado, entonces se llama a la versión derivada.

+0

Para decir una clase Derivada ** overiddes ** la función de la clase Base, la palabra clave 'virtual' tiene que estar involucrada si no, no está overidding. –

+0

No, todavía prevalece. Pero, en caso de que no utilice virtual, entonces la versión de la clase base es reemplazada por la versión de clase derivada. Y no hay forma de elegir la versión que le gustaría usar. Ahora, si quiere que todas las versiones reemplazadas sigan disponibles, debe marcarlas como virtuales. – Drona

+0

Lamento decírtelo pero es incorrecto, si no hay una palabra clave 'virtual', entonces no está en exceso. –

Cuestiones relacionadas