 |
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 |
|
 |
Powered by phpBB © 2001, 2006 phpBB Group
|