 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
alexander.schmoeller@goog Guest
|
Posted: Sun May 13, 2007 4:35 pm Post subject: Newbie: Virtuelle Funktionen bei new Arrays |
|
|
Hallo,
ich habe da ein kleines Problem. Ich habe zwei Klassen A und B, wobei
B von A erbt.
In A und B gibt es die public Funktion print(), in A ist sie
implementiert und als virtual definiert, in B ist sie überschrieben:
<pre>
class KlasseA {
public:
virtual void print() const { cout << endl << "Klasse A" << endl; }
};
class KlasseB: public KlasseA {
public:
void print() const { cout << endl << "Klasse B" << endl; }
};
</pre>
Wenn ich nun ein Array anlege:
und jeweils eine Instanz der beiden Klassen reingebe und darauf
print() aufrufe:
KlasseA* liste[2];
<pre>
liste[0] = new KlasseA();
liste[1] = new KlasseB();
liste[0]->print();
liste[1]->print();
</pre>
dann bekomme ich die erwartete Ausgabe:
<pre>Klasse A
Klasse B
</pre>
lege ich das array aber mit new an:
<pre>
KlasseA* liste = new KlasseA[2];
liste[0] = KlasseA();
liste[1] = KlasseB();
liste[0].print();
liste[1].print();
</pre>
Bekomme ich als output:
<pre>
Klasse A
Klasse A
</pre>
Warum ist das so und wie funktioniert es richtig?
Bin um jede Hilfe, Link etc dankbar.
Gruss
Alexander |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Sun May 13, 2007 7:46 pm Post subject: Re: Newbie: Virtuelle Funktionen bei new Arrays |
|
|
alexander.schmoeller (AT) googlemail (DOT) com wrote:
| Quote: | Hallo,
ich habe da ein kleines Problem. Ich habe zwei Klassen A und B, wobei
B von A erbt.
In A und B gibt es die public Funktion print(), in A ist sie
implementiert und als virtual definiert, in B ist sie überschrieben:
pre
class KlasseA {
public:
virtual void print() const { cout << endl << "Klasse A" << endl; }
};
class KlasseB: public KlasseA {
public:
void print() const { cout << endl << "Klasse B" << endl; }
};
/pre
Wenn ich nun ein Array anlege:
und jeweils eine Instanz der beiden Klassen reingebe und darauf
print() aufrufe:
KlasseA* liste[2];
|
Also ein Array aus Zeigern auf KlasseA.
| Quote: | pre
liste[0] = new KlasseA();
liste[1] = new KlasseB();
liste[0]->print();
liste[1]->print();
/pre
dann bekomme ich die erwartete Ausgabe:
pre>Klasse A
Klasse B
/pre
lege ich das array aber mit new an:
pre
KlasseA* liste = new KlasseA[2];
|
Also ein Array aus KlasseA. Jedes Element dieses Arrays ist vom Typ KlasseA
und wird es auch immer bleiben.
| Quote: | liste[0] = KlasseA();
|
Hier wird liste[0] ein temporäres default-konstruiertes Objekt vom Typ
KlasseA zugewiesen. Das ist unnötig.
| Quote: | liste[1] = KlasseB();
|
Hier wird ein temporäres Objekt von KlasseB angelegt, dann wird dessen
KlasseA-Anteil dem Element 1 von Liste zugewiesen.
| Quote: | liste[0].print();
liste[1].print();
/pre
Bekomme ich als output:
pre
Klasse A
Klasse A
/pre
Warum ist das so und wie funktioniert es richtig?
|
Das ist so, weil ein Objekt seinen Typ nicht ändern kann. Richtig geht es
so:
KlasseA** liste = new KlasseA*[2];
liste[0] = new KlasseA();
liste[1] = new KlasseB();
liste[0]->print();
liste[1]->print(); |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Sun May 13, 2007 8:00 pm Post subject: Re: Newbie: Virtuelle Funktionen bei new Arrays |
|
|
"alexander.schmoeller (AT) googlemail (DOT) com" <alexander.schmoeller (AT) googlemail (DOT) com> writes:
| Quote: | lege ich das array aber mit new an:
pre
KlasseA* liste = new KlasseA[2];
liste[0] = KlasseA();
liste[1] = KlasseB();
|
Hier passiert "slicing". liste[1] ist vom Typ A; also wird vom
temporären B-Objekt nur die "Teilscheibe" vom Typ A zugewiesen.
| Quote: | liste[0].print();
liste[1].print();
/pre
Bekomme ich als output:
pre
Klasse A
Klasse A
/pre
Warum ist das so
|
Siehe oben.
| Quote: | Warum ist das so und wie funktioniert es richtig?
|
Zweimal Ausgabe von "Klasse A" *ist* richtig. |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|