Pregunta

Tal vez me equivoque, pero esto parece ser una pregunta muy básica. De repente, mi cadena de herencia ha dejado de funcionar. Escribir una pequeña aplicación de prueba básica demostró que era yo que estaba mal (así que no puedo echarle la culpa al compilador).

Tengo una clase base, con el comportamiento por defecto en una función virtual. Una clase hija se deriva de eso y cambia el comportamiento.

#include <iostream>

class Base
{
public:
    Base() { print(); }
    ~Base() {}

protected:
    virtual void print() { std::cout << "base\n"; }
};

class Child : public Base
{
public:
    Child() {}
    ~Child() {}

protected:
    virtual void print() { std::cout << "child\n"; }
};

int main()
{
    Base b;
    Child c;
}

Esto imprime:

base
base

Cuando se crea una instancia del niño, ¿por qué se base :: print () se llama? Pensé que mediante el uso de la palabra clave virtual, la función puede ser reemplazado para la clase derivada.

¿En qué momento qué me he confundido?

¿Fue útil?

Solución

Está llamando a un método virtual en el constructor, que no se va a trabajar, como la clase de niño no está totalmente inicializado.

esta cuestión StackOverflow .

Otros consejos

A pesar de su problema actual es el llamado método virtual de un constructor que otros han mencionado, he notado que usted no puso a los destructores virtuales. Eso es normalmente una mala cosa. En su caso, los destructores son NOP y no hay miembros que son los objetos con los destructores, ... pero si su código cambia, entonces es fácil para que sucedan cosas malas.

este enlace para una explicación detallada (por no llamar a las funciones virtuales de Héctor / dTOR).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top