C ++ de programación: cuando es una función virtual no?

En C ++, sólo porque usted piensa que una llamada de función en particular está obligado finales no significa que sea. Si no se declara con los mismos argumentos en las subclases, las funciones miembro no se redefinen polimórfica, si son o no son declarados virtual.

Video: Curso de C++ 93 Funciones Virtuales

Una excepción a la regla de declaración idénticas es que si la función miembro de la clase base devuelve un puntero o referencia a un objeto de clase base, una función miembro se reemplaza en una subclase puede devolver un puntero o una referencia a un objeto de la subclase. En otras palabras, la función Hacer una copia() es polimórfico, a pesar de que el tipo de retorno de las dos funciones difieren:

Class Base {public: // devuelve una copia de la corriente objectBase * makeACopy () -} - subclase clase: Base pública {public: // devuelve una copia de la corriente objectSubClass * makeACopy () -} - vacío fn (Base& bc) {* Base PCOPY = bc.makeACopy () - // proceder sobre ...}

En la práctica, esto es muy natural. UN Hacer una copia() función debe devolver un objeto de tipo subclase, a pesar de que podría invalidar BaseClass :: makeACopy ().

Este negocio de decidir en silencio cuando una función se anula y cuando no es una fuente de error en C ++ - tanto es así que el estándar de 2011 introdujo el descriptor anular que el programador puede utilizar para indicar su intención de anular una función de la clase base.

C ++ genera un error de compilación si una función de anulación se declara pero no, de hecho, anular una función de clase base por alguna razón (por ejemplo, un argumento no coincidentes) como en el siguiente ejemplo:

Video: Bloque 4.3: Funciones de tipo Void y Factorial de un Numero con Funciones

Estudiante clase {public: virtual de vacío addCourseGrade (doble grado) -} - clase GradStudent: Estudiante pública {public: virtual addCourseGrade (grado de flotación) override void -} -

Este fragmento genera un error de tiempo de compilación porque el método GradStudent :: addCourseGrade (float) fue declarado anular pero no, de hecho, anula la función de la clase base Estudiante :: addCourseGrade (doble) debido a que los tipos de argumentos no coinciden.

El programador también puede declarar una función que no overrideable utilizando el final palabra clave, incluso si esa función en sí invalida alguna función de la clase base anterior, como se demuestra en el siguiente adicional PostDoc clase:

clase GradStudent: Estudiante pública {public: virtual de vacío addCourseGrade (doble grado) final -} - PostDoc clase: GradStudent pública {public: virtual addCourseGrade vacío (doble grado) -} -

Ya que Estudiante :: addCourseGrade () está marcado final, la declaración de PostDoc :: addCourseGrade () genera un error porque intenta omitir la Estudiante método.

Además, toda la clase pueda ser declarada final:

GradStudent clase final: Estudiante pública

Esto afecta a algo más que los métodos virtuales de la clase. UN final clase no puede heredarse de en absoluto.

Artículos Relacionados