Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich habe eine Klasse A:

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

Und eine Klasse B:

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

Und dann in main () ich:

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

Wenn ich stattdessen tun:

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

Alles kompiliert gut, aber es scheint, als ob es vielleicht etwas falsch mit meinem Polymorphismus ist? Ich bin verwirrt.

War es hilfreich?

Lösung

Sie können keine Arrays polymorph behandeln, so dass während new B[100] eine Reihe von B Objekte erstellt und gibt einen Zeiger auf das Array - oder äquivalent das erste Element des Arrays - und während es gültig ist, diesen Zeiger auf einen Zeiger zuzuweisen eine Basisklasse, ist es nicht gültig ist dies als ein Zeiger in ein Array von A Objekten zu behandeln.

Der Hauptgrund, dass Sie nicht können, ist, dass (in der Regel) abgeleitete Objekte eine andere Größe, um ihre Basisklassen sind, so versuchen, das Array als ein Array von Basisklasse-Objekte zuzugreifen, nicht den einen Zeiger bekommen Offset richtig verwenden an die nächste Basisklasse Subobjekt des nächsten Mitglied der Klasse Array abgeleitet.

Andere Tipps

Es gibt kein Problem mit dem polymrphism aber mit der Art und Weisen Sie mit dem Gedächtnis zu tun hat. Der [] wird von einem Operator durch das Array durch die sizeof (A) vorzurücken Bytes im ersten Fall und die sizeof (B) Bytes in dem zweiten Fall. Da die Objekte vom Typ B dem A * ist nicht auf die richtige Stelle im Speicher zeigt.

Hier ist eine andere Art und Weise, es zu betrachten

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

Sie haben nicht die Objekte in dem Array zuweisen:

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

(obwohl ich C ++ und C # kann Vermischung)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top