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

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.