estoy descaradamente arrancando un código de ejemplo de la página de Wikipedia Virtual function:
#include <iostream>
#include <vector>
class Animal {
public:
virtual void eat() const {
std::cout << "I eat like a generic Animal." << std::endl;
}
virtual ~Animal() {
}
};
class Wolf : public Animal {
public:
void eat() const {
std::cout << "I eat like a wolf!" << std::endl;
}
};
class Fish : public Animal {
public:
void eat() const {
std::cout << "I eat like a fish!" << std::endl;
}
};
Si llama eat()
dentro del Animal
constructor, se llamará a la Animal
eat()
funcionan todo el tiempo. Incluso cuando se crea un objeto o una Wolf
Fish
, ya que el constructor Animal
completará antes de que se inicializa el objeto de subclase, no existirán los primordiales eat
funciones todavía.
Esto es una desventaja porque puede causar confusión entre lo que se espera y lo que realmente sucede. Si sobreescribo eat
y luego creo un objeto de mi subclase, espero que se llame a mi función reemplazada, incluso desde una referencia Animal
. Lo espero porque eso es lo que sucede cuando la llamada se hace explícitamente por código fuera del constructor. El comportamiento es diferente dentro del constructor, haciendo que me rasque la cabeza con desconcierto.
Esta es una de las razones por las que no me gusta la guía de estilo de google C++. Llamar a los métodos virtuales desde constructores y destructores debe evitarse per se como regla general, donde evitarlo solo lo hace si tiene un buen motivo y puede defenderlo en una revisión del código. Por otro lado, la recomendación de usar una inicialización de dos pasos es (indiscutiblemente) errónea, y muchas otras guías de estilo recomiendan contra la inicialización en dos pasos ... –
Tenga en cuenta que la guía de estilo de Google no es C++, a pesar del título de la página . Prohíben las excepciones, dando un lenguaje bastardo en el que muchas expresiones idiomáticas de C++ no se pueden usar o se les quita su utilidad. Esta es la razón por la que requieren una inicialización en dos etapas y todos los dolores de cabeza propensos a errores que esto conlleva; no hay forma de indicar falla de un constructor. A menos que tenga una razón específica para seguir el estilo de Google, ignórelo. –