Esta puede parecer una pregunta simple, pero no puedo encontrar la respuesta en ningún otro lugar.
Supongamos que tengo lo siguiente:
class Abstract {
public:
virtual void foo() = 0;
virtual void bar();
}
class Derived : Abstract {
public:
virtual void foo();
}
¿Está bien que la clase Derived no implemente la función bar ()? ¿Qué pasa si no TODAS mis clases derivadas necesitan la función bar (), pero algunas sí? ¿Todas las funciones virtuales de una clase base abstracta deben implementarse en las clases derivadas, o solo en las que son puramente virtuales? Gracias
fuente
Derived::bar
tiene un cuerpo funcional, el deAbstract::bar
. Entonces, parece que la unidad de traducción donde se define (¿está definida en algún lugar?) No está vinculada a la unidad de traducción donde se llama.They only need to implement the pure ones.
Es engañoso. Las clases derivadas tampoco necesitan implementar funciones virtuales puras .Solo los métodos virtuales puros deben implementarse en clases derivadas, pero aún necesita una definición (y no solo una declaración) de los otros métodos virtuales. Si no proporciona uno, es muy posible que el enlazador se queje.
Entonces, simplemente poner
{}
después de su método virtual opcional le da una implementación predeterminada vacía:class Abstract { public: virtual void foo() = 0; // pure virtual must be overridden virtual void bar() {} // virtual with empty default implementation }; class Derived : Abstract { public: virtual void foo(); };
Sin embargo, una implementación predeterminada más complicada iría en un archivo fuente separado.
fuente
El estándar ISO C ++ especifica que se deben definir todos los métodos virtuales de una clase que no sean puramente virtuales.
En pocas palabras, la regla es:
si su clase derivada anula el método virtual de la clase Base, entonces también debería proporcionar una definición.
Según la regla anterior en su ejemplo de código,
virtual void bar();
necesita una definición en la clase Base.Referencia:
Estándar C ++ 03: 10.3 Funciones virtuales [class.virtual]
Por lo tanto, debe hacer que la función sea puramente virtual o proporcionar una definición para ella.
El faq de gcc también lo documenta:
fuente
Sí, está bien ... solo necesita implementar cualquier función virtual pura para crear una instancia de una clase derivada de una clase base abstracta.
fuente
Sí, es correcto que una clase derivada tenga que ANULAR la función que es pura virtual en la clase principal. La clase principal que tiene una función virtual pura se llama clase abstracta solo porque su clase secundaria debe proporcionar su propio cuerpo de la función virtual pura.
Para las funciones virtuales normales: - No es necesario anularlas más, ya que algunas clases secundarias pueden tener esa función, otras no.
El propósito principal del mecanismo de función virtual es el polimorfismo en tiempo de ejecución, ya sea que el propósito principal de la función virtual pura (clase abstracta) sea hacer que sea obligatorio tener el mismo nombre de función con el propio cuerpo.
fuente