Domanda

    

Questa domanda ha già una risposta qui:

         

Ho una classe A:

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

E una classe B:

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

E poi in main () lo faccio:

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

Se invece lo faccio:

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

Tutto si compila bene, ma sembra che ci sia qualcosa di sbagliato nel mio polimorfismo? Sono perplesso.

È stato utile?

Soluzione

Non puoi trattare le matrici polimorficamente, quindi mentre new B [100] crea una matrice di oggetti B e restituisce un puntatore alla matrice - o equivalentemente il primo elemento dell'array - e sebbene sia valido assegnare questo puntatore a un puntatore a una classe base, non è valido trattarlo come un puntatore in un array di oggetti A .

Il motivo principale per cui non puoi farlo è che (in genere) gli oggetti derivati ??hanno dimensioni diverse dalle loro classi di base, quindi il tentativo di accedere all'array come un array di oggetti di classe di base non utilizzerà l'offset corretto per ottenere un puntatore al successivo oggetto secondario della classe base del membro successivo dell'array della classe derivata.

Altri suggerimenti

Non c'è alcun problema con il polimorfismo ma con il modo in cui hai a che fare con la memoria. L'operatore [] ti farà avanzare attraverso l'array in base al byte sizeof (A) nel primo caso e al byte sizeof (B) nel secondo caso. Poiché gli oggetti sono di tipo B, A * non indica la posizione corretta in memoria.

Ecco un altro modo di vederlo

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

Non hai allocato gli oggetti nell'array:

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

(anche se potrei confondere C ++ e C #)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top