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 

Klasse ableiten mit zus344tzlicher Spezia...^

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





PostPosted: Wed Mar 02, 2005 7:25 pm    Post subject: Klasse ableiten mit zus344tzlicher Spezia...^ Reply with quote



Hallo,

ich habe ein abstrakte Klasse

class var
{
public:
var();
~var()
}

sowie eine von var abgeleitete Klasse

class implVar : public var
{
public:
Implvar();
~Implvar()
}


und eine weitere Klasse, die die Klasse var verwendet

class base
{
public:
base();
~base();
var* doSomething(var* variable);
}


Nun möchte ich von Base eine Klasse ableiten, die nicht nur zusätzliche
Methoden enthält, wie etwa

class dervBase : public Base
{
public:
dervBase();
~dervBase();
var* doSomething(var* variable);
void doSometingElse();
}

sondern die auch die Rückgabetypen spezialisiert, also etwa so

class dervBase : public Base
{
public:
dervBase();
~dervBase();
implVar* doSomething(implVar* variable);
void doSometingElse();
}


Gibt es eine Möglichkeit wie ich das erreichen kann?
(Ich vermute, dass man das mit Templates machen kann. Allerdings kenne ich
mich nicht sehr mit Templates aus.)
Gibt es also im Speziellen eine Möglichkeit dies ohne Einsatz von Templates
zu erreichen?


vielen Dank


mfg
matthias

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rolf Magnus
Guest





PostPosted: Wed Mar 02, 2005 8:43 pm    Post subject: Re: Klasse ableiten mit zusätzlicher Spezialisierung Reply with quote



Matthias W wrote:

Quote:
Hallo,

ich habe ein abstrakte Klasse

class var
{
public:
var();
~var()
}

sowie eine von var abgeleitete Klasse

class implVar : public var
{
public:
Implvar();
~Implvar()
}


und eine weitere Klasse, die die Klasse var verwendet

class base
{
public:
base();
~base();
var* doSomething(var* variable);
}


Nun möchte ich von Base eine Klasse ableiten, die nicht nur zusätzliche
Methoden enthält, wie etwa

class dervBase : public Base
{
public:
dervBase();
~dervBase();
var* doSomething(var* variable);
void doSometingElse();
}

sondern die auch die Rückgabetypen spezialisiert, also etwa so

class dervBase : public Base
{
public:
dervBase();
~dervBase();
implVar* doSomething(implVar* variable);
void doSometingElse();
}


Gibt es eine Möglichkeit wie ich das erreichen kann?

Genauso, wie du es geschrieben hast. Die Funktion sollte aber vermutlich
virtuell sein.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Maeder
Guest





PostPosted: Wed Mar 02, 2005 8:44 pm    Post subject: Re: Klasse ableiten mit zusätzlicher Spezialisierung Reply with quote




Bitte poste in Zukunft korrekten Code (oder solchen, der so korrekt
ist, wie's möglich ist). Sonst muss Deine Leserschaft zu erraten
versuchen, ob das Problem bloss in den Flüchtigkeitsfehlern
liegt. Danke!

"Matthias W" <madde.w (AT) web (DOT) de> writes:

Quote:
ich habe ein abstrakte Klasse

class var
{
public:
var();
~var()
}

Ziemlich konkret für eine abstrakte Klasse :-)


Quote:
sowie eine von var abgeleitete Klasse

class implVar : public var
{
public:
Implvar();
~Implvar()
}


und eine weitere Klasse, die die Klasse var verwendet

class base
{
public:
base();
~base();
var* doSomething(var* variable);
}


Nun möchte ich von Base eine Klasse ableiten, die nicht nur zusätzliche
Methoden enthält, wie etwa

class dervBase : public Base
{
public:
dervBase();
~dervBase();
var* doSomething(var* variable);
void doSometingElse();
}

sondern die auch die Rückgabetypen spezialisiert, also etwa so

class dervBase : public Base
{
public:
dervBase();
~dervBase();
implVar* doSomething(implVar* variable);
void doSometingElse();
}


Gibt es eine Möglichkeit wie ich das erreichen kann?

Ja. Du hast es ja bereits erreicht. Wo ist das Problem?

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Matthias W
Guest





PostPosted: Wed Mar 02, 2005 9:30 pm    Post subject: Re: Klasse ableiten mit zustzlicher Spezialisierung Reply with quote


"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb im Newsbeitrag
news:d0585b$t4p$02$1 (AT) news (DOT) t-online.com...

Quote:
Genauso, wie du es geschrieben hast. Die Funktion sollte aber vermutlich
virtuell sein.
Das war wohl nicht klar genung ausgedrückt was ich meine.

Ja das kann ich schon so schreiben, allerdings hat meine abgeleitete Klasse
doch immer noch die Methode "var* doSomething(var* variable);" und eben noch
zusätzlich
die Methode "implVar* doSomething(implVar* variable)".
Es soll aber die ableitete Klasse nur noch "implVar* doSomething(implVar*
variable)" besitzen.
Es soll also ein Objekt o der Klasse dervBase der Aufruf
o.doSomething(variable)
nur dann erlaubt sein wenn variable nicht nur die Schnittstelle var
implementiert, sondern tatsächlich vom Typ implVar ist.
Die Frage ist also wie ich die Methode "var* doSomething(var* variable);"
durch die Methode "implVar* doSomething(implVar* variable)" ersetzen kann.?

mfg matthias

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Daniel Albuschat
Guest





PostPosted: Thu Mar 03, 2005 3:20 pm    Post subject: Re: Klasse ableiten mit zustzlicher Spezialisierung Reply with quote

Matthias W wrote:
Quote:
"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb im Newsbeitrag
news:d0585b$t4p$02$1 (AT) news (DOT) t-online.com...

Genauso, wie du es geschrieben hast. Die Funktion sollte aber vermutlich
virtuell sein.

Das war wohl nicht klar genung ausgedrückt was ich meine.
Ja das kann ich schon so schreiben, allerdings hat meine abgeleitete Klasse
doch immer noch die Methode "var* doSomething(var* variable);" und eben noch
zusätzlich
die Methode "implVar* doSomething(implVar* variable)".

Das stimmt nicht ganz. Die Methode doSomething aus dervBase
ueberschreibt (virtuell!) die Methode aus base. Nur duerfen die
Parameter nicht unterschiedlich sein. Rueckgabetypen duerfen bei
Pointern innerhalb einer Klassenhierarchie aber (abwaerts) variieren.
Damit doSomething aus dervBase die aus base auch wirklich ueberschreibt,
muss es "implVar* doSomething(var* variable);" sein.

Quote:
Es soll aber die ableitete Klasse nur noch "implVar* doSomething(implVar*
variable)" besitzen.
Es soll also ein Objekt o der Klasse dervBase der Aufruf
o.doSomething(variable)
nur dann erlaubt sein wenn variable nicht nur die Schnittstelle var
implementiert, sondern tatsächlich vom Typ implVar ist.
Die Frage ist also wie ich die Methode "var* doSomething(var* variable);"
durch die Methode "implVar* doSomething(implVar* variable)" ersetzen kann.?

Also zuerst; deine ``var'' Klasse ist nicht abstrakt. Abstrakt ist eine
Klasse dann, wenn sie mindestens eine abstrakte Methode hat.
``var'' hat nichtmals eine virtuelle.
Und die Methode doSomething moechtest du hoechstwahrscheinlich in
base als ``virtual'' deklarieren.

Zweitens: Wenn eine Klasse von einer Basisklasse ableitet, kann sie
immer stellvertretend fuer die Basisklasse genutzt werden. Wenn du die
Moeglichkeiten der Basisklasse einschraenkst, ist das nicht gegeben.
Und genau das versuchst du mit deiner doSomething Methode. Sie kann
weniger als die Basisklasse, naemlich nur mit implVar* statt mit var*
umgehen.

Soetwas ist nicht ueber den Vererbungsmechanismus moeglich und auch
nicht gewollt.

Verhindern, dass deine abgeleitete Klasse etwas anderes als implVar in
doSomething uebergeben bekommt, kannst du nicht. Und zwar deswegen,
weil doSomething von dervBase immernoch ueber einen base-Pointer
aufgerufen werden kann. Und hier hat man keine Moeglichkeit (ausser
ueber dynamic_cast in dervBase::doSomething, das ist aber Laufzeit und
damit Fehleranfaelliger) herauszufinden, dass er nur implVar haben darf.

MfG,
Daniel

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Matthias W
Guest





PostPosted: Fri Mar 04, 2005 1:30 pm    Post subject: Re: Klasse ableiten mit zustzlicher Spezialisierung Reply with quote

Daniel Albuschat wrote:

'
snip
'

Quote:
Verhindern, dass deine abgeleitete Klasse etwas anderes als implVar in
doSomething uebergeben bekommt, kannst du nicht. Und zwar deswegen,
weil doSomething von dervBase immernoch ueber einen base-Pointer
aufgerufen werden kann. Und hier hat man keine Moeglichkeit (ausser
ueber dynamic_cast in dervBase::doSomething, das ist aber Laufzeit und
damit Fehleranfaelliger) herauszufinden, dass er nur implVar haben
darf.
Danke, das hat mir sehr weitergeholfen.


mfg Matthias

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

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.