En C++ cuando se llama a una función virtual desde un constructor, no se comporta como una función virtual. Creo que todos los que se encontraron por primera vez se sorprendieron, pero pensándolo mejor, si el constructor derivado aún no ha ejecutado el objeto es no pero derivado ¿cómo se puede llamar a una función derivada? Las condiciones previas no han tenido la oportunidad de configurarse. Ejemplo:Funciones virtuales en constructores, ¿por qué los idiomas son diferentes?
class base {
public:
base()
{
std::cout << "foo is " << foo() << std::endl;
}
virtual int foo() { return 42; }
};
class derived : public base {
int* ptr_;
public:
derived(int i) : ptr_(new int(i*i)) { }
// The following cannot be called before derived::derived due to how C++ behaves,
// if it was possible... Kaboom!
virtual int foo() { return *ptr_; }
};
Es exactamente lo mismo para Java y .NET sin embargo, optaron por ir a otro lado, fue la única razón por la el principio de la menor sorpresa?
¿Cuál crees que es la elección correcta?
¿Cómo funciona esto más para el compilador? Simplemente se reduce a configurar el vptr después de llamar al constructor de la clase base. Yo diría que las otras semánticas son más difíciles de implementar ya que debes asegurarte de que después de configurar el vptr en el constructor de la clase derivada, no debe ser anulado por los constructores de las clases base. (Esto supone que el envío dinámico se maneja a través de punteros a tablas de métodos virtuales, que es el enfoque más común). –
@LucTouraille muy tardía +1, eso es muy cierto. el enfoque C++ es mucho más limpio y directo, en realidad –