Was foo denkt Sie vorbei, ein Array von test
Instanzen:
--------------------------
a --> |base|base|base|base|base|
--------------------------
wo jeder base
auf 0
initialisiert.
, was Sie vorbei eigentlich ein Array von deri
Instanzen:
----------------------------------------------
a --> |base,der|base,der|base,der|base,der|base,der|
----------------------------------------------
wo jeder base
-0
initialisiert wird, und jeder der
auf 1
initialisiert.
Wenn a
inkrementiert, die Funktion inkrementiert die Speicheradresse für den Schritt einer test
Trägerrechnung (da dies die Art von a
), die But-Ein Mitglied hat: base
. In Wirklichkeit ist das Objekt, das übergeben wird, deri
und hat somit zwei Mitglieder: base
und der
. So nach dem ersten Zuwachs, denken Sie dies tun:
--------------------------
|base|base|base|base|base|
--------------------------
a -------^
aber in Wirklichkeit Sie dies tun:
----------------------------------------------
|base,der|base,der|base,der|base,der|base,der|
----------------------------------------------
a -------^
und a
, dachte, es weist auf die zweite test
, ist eigentlich zeigt auf das zweite Mitglied der erstenderi
Objekt. Eine kleine Instrumentierung wird dies zeigen. Drucken der Adressen jedes Mitglied, bevor wir das Array foo
, dann senden die zeigen, was wir tun, tatsächlich in foo
:
#include <iostream>
using namespace std;
class test {
public:
int base;
test() {
base = 0;
}
};
class deri : public test {
public:
int der;
deri() {
der = 1;
}
};
void foo(test* a, size_t size) {
for (int i = 0; i != size; i++, a++) {
cout << (const void*)&(*a).base << ',' << (*a).base << endl;;
}
cout << endl;
}
int main()
{
deri b[5];
for (auto const& x : b)
std::cout <<(const void*)&x.base << ',' << (const void*)&x.der << '\n';
foo(b, 5);
return 0;
}
Ausgabe
0x7fff5fbff970,0x7fff5fbff974
0x7fff5fbff978,0x7fff5fbff97c
0x7fff5fbff980,0x7fff5fbff984
0x7fff5fbff988,0x7fff5fbff98c
0x7fff5fbff990,0x7fff5fbff994
0x7fff5fbff970,0
0x7fff5fbff974,1
0x7fff5fbff978,0
0x7fff5fbff97c,1
0x7fff5fbff980,0
Beachten Sie die Adressen werden systemabhängig aber hoffentlich kommst du auf die Idee. Kurz gesagt, Sie haben einen Fehler.
Ich sehe Sie sind neu hier in SO - das ist der gute und richtige Weg, um Code zu senden! – STF
Ich kenne Stackoverflow nicht. das tut mir leid. Ich habe Codes als das Bild gesetzt. – Stary
Ihre Implementierung von 'foo' nimmt an, dass das' a', das Sie übergeben, eine Sequenz von 'test'-Objekten adressiert, was es nicht tut *. Der Schritt einer Folge von "Test" unterscheidet sich von dem Schritt einer Folge von "Deri" aufgrund der Hinzufügung des "Deri :: der" -Elements. – WhozCraig