 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Matthias W Guest
|
Posted: Wed Mar 02, 2005 7:25 pm Post subject: Klasse ableiten mit zus344tzlicher Spezia...^ |
|
|
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
|
Posted: Wed Mar 02, 2005 8:43 pm Post subject: Re: Klasse ableiten mit zusätzlicher Spezialisierung |
|
|
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
|
Posted: Wed Mar 02, 2005 8:44 pm Post subject: Re: Klasse ableiten mit zusätzlicher Spezialisierung |
|
|
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
|
Posted: Wed Mar 02, 2005 9:30 pm Post subject: Re: Klasse ableiten mit zustzlicher Spezialisierung |
|
|
"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
|
Posted: Thu Mar 03, 2005 3:20 pm Post subject: Re: Klasse ableiten mit zustzlicher Spezialisierung |
|
|
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
|
Posted: Fri Mar 04, 2005 1:30 pm Post subject: Re: Klasse ableiten mit zustzlicher Spezialisierung |
|
|
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 |
|
 |
|
|
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
|
|