Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Tengo una clase A:

class A
{
    public:
        virtual double getValue() = 0;
}

Y una clase B:

class B : public A
{
    public:
        virtual double getValue() { return 0.0; }
}

Y luego en main () hago:

A * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //This, or any other index besides 0, causes the program to quit

Si en cambio lo hago:

B * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //Everything else works fine too

¿Todo compila bien, pero parece que hay algo mal con mi polimorfismo tal vez? Estoy desconcertado.

¿Fue útil?

Solución

No puede tratar matrices polimórficamente, así que mientras new B [100] crea una matriz de objetos B y devuelve un puntero a la matriz, o de manera equivalente a la primera elemento de la matriz, y si bien es válido asignar este puntero a un puntero a una clase base, no es válido tratar esto como un puntero a una matriz de objetos A .

La razón principal por la que no puede es que (normalmente) los objetos derivados tienen un tamaño diferente al de sus clases base, por lo que intentar acceder a la matriz como una matriz de objetos de clase base no utilizará el desplazamiento correcto para obtener un puntero al siguiente subobjeto de clase base del siguiente miembro de la matriz de clase derivada.

Otros consejos

No hay ningún problema con el polimrfismo, sino con la forma en que maneja la memoria. El operador [] lo hará avanzar a través de la matriz por los bytes sizeof (A) en el primer caso y los bytes sizeof (B) en el segundo caso. Debido a que los objetos son de tipo B, A * no apunta a la ubicación correcta en la memoria.

Aquí hay otra forma de verlo

char * var;
var = (char*) new B[100];
std::cout << ((A*)var[0]).getValue(); //This works fine
std::cout << ((A*)var[1]).getValue(); //This will fail
std::cout << ((A*)var[sizeof(B)]).getValue(); // should work

No asignó los objetos en la matriz:

for (int i=0;i<100;i++)
  var[i] = new B;

(aunque puedo estar mezclando C ++ y C #)

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