C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Newbie: Virtuelle Funktionen bei new Arrays

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
alexander.schmoeller@goog
Guest





PostPosted: Sun May 13, 2007 4:35 pm    Post subject: Newbie: Virtuelle Funktionen bei new Arrays Reply with 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];
<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





PostPosted: Sun May 13, 2007 7:46 pm    Post subject: Re: Newbie: Virtuelle Funktionen bei new Arrays Reply with quote



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





PostPosted: Sun May 13, 2007 8:00 pm    Post subject: Re: Newbie: Virtuelle Funktionen bei new Arrays Reply with quote



"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
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
 


Powered by phpBB © 2001, 2006 phpBB Group