Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Methoder der Unterklasse über Basiszeiger ansprechen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.06.2007, 15:35 Uhr
Karldin Shinowa
Professional Noob


arbeite mich grad durch c# durch und überlege ob es hierfür eine c++ entsprechung gibt


C++:
class basis
{
//... keine virtuellen methoden
}

class unter: basis
{
public void foo(){..}
//...
}

int main()
{
   basis zeiger=new unter;

   if(zeiger is unter) (zeiger as unter).foo();
}



Nein oder? Oder geht das auch in c++
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.06.2007, 16:04 Uhr
0xdeadbeef
Gott
(Operator)


Wenn du sowas machen musst, ist das ein Zeichen für schlechtes Design. Möglich ist es so:

C++:
int main() {
  basis *zeiger = new unter();
  unter *zeiger2 = dynamic_cast<unter*>(zeiger);

  if(zeiger2 != NULL) zeiger2->foo();
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.06.2007, 16:05 Uhr
Blubber2063



Hmmm, naja wenn du nen reinterpret_cast machst dann sollte das gehen, das testen machst du mit type_info& typeid(DTYP) das rufst du auf deine beiden typen auf und vergleichst mit dem == Operator.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.06.2007, 16:13 Uhr
Karldin Shinowa
Professional Noob


Aha. da fällt mir ein: kennt ihr nen guten link wo die ganzen casts(kenne eigentlich nur static_cast) beschrieben sind?
Meinst du so Blubber?


C++:
basis * zeiger= new unter;

if( typeid( reinterpret_cast<unter>(*zeiger)) ==typeid(unter))
{
//casten und aktion
}



Warum wäre das schlechter Stil Oxdeadbeef und warum is sowas dann ijn c# so gut implementiert....
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.06.2007, 16:30 Uhr
Blubber2063



Nein ich meinte das fast so:

C++:
basis * zeiger= new unter;
unter *z;

if( typeid( *zeiger) ==typeid(unter))
{
  z = reinterpret_cast<unter*>(zeiger);
  z->foo();
}


Also was ich immer ganz nett zum nachschlagen für sowas fand war
http://cpp-tutor.de.

Dieser Post wurde am 30.06.2007 um 16:31 Uhr von Blubber2063 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.06.2007, 18:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ansonsten ist das ein designfehler normalerweise

evtl machts z.b bei sowas sinn die funktion "foo" pure-virtual in base zu definieren, dann kannste das ohne nach unter zu casten baseObj->foo(); schreiben und es wird die von unter aufgerufen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.06.2007, 19:09 Uhr
0xdeadbeef
Gott
(Operator)


dynamic_cast ist genau für diese Scherze gedacht - wos dann doch mal nötig ist. Aber...wie mutable, const_cast und Konsorten sind das Sprachkonstrukte, die man nach Möglichkeit vermeiden sollte - wenn ich ein dynamic_cast im Code sehe, weiß ich schon "Aha, dreckiger Hack ums eben mal schnell ans Laufen zu kriegen".

Die ganze Idee hinter Objektorientierung und Klassenvererbung ist ja, dass du an dieser Stelle die abgeleitete Klasse garnicht mehr benötigen solltest, weil die Basisklasse das nötige Interface bereits bereitstellt. Also sieh zu, dass du die Basisklasse so designst, dass du mit ihrem Interface auskommst.

In C# ist das so implementiert, weil Java es so macht und sies da abgekupfert haben. In Java gibt es das so, weil viele Programmierer das Konzept der Objektorientierung nur so halb verstanden haben und sowas dauernd brauchten, und weil für die zuständigen Manager der Markt entschied was gut war. Darum gibts auch die ganzen Sprachinkonsistenzen um java.lang.String, zum Beispiel. Außerdem - in Java wird sowieso alles dynamisch zur Laufzeit gemacht, von daher - wenn man da ein paar mehr potentielle Fehlerquellen einbaut, die man zur Compilezeit so gut wie garnicht abfangen kann, macht es so den großen Unterschied auch nicht mehr.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 30.06.2007 um 19:12 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.06.2007, 22:06 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja dynamic_casts braucht man schon - dafür sind sie ja da. du kannst nun mal nicht einfach alles in einer basisklasse bereitstellen, das geht nun einfach nicht wenn man z.b einen komplexen Ableitungsbaum hat - überleg nur mal z.b ein Speicher- und Datenformat! Da braucht man z.b für Bitmaps diverse Methoden die man jetzt bei einer einfachen Textdatei. Da braucht man dann schon dynamic_casts.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.07.2007, 15:55 Uhr
0xdeadbeef
Gott
(Operator)


goto und const_cast gibt es auch, und man braucht sie nicht, wenn man seinen Kram vernünftig aufzieht. Du kannst für bestimmte Operationen halt eine Bitmap nicht über den selben Kamm scheren wie eine Textdatei - das heißt aber nicht, dass du in der Gegend hin- und hercasten solltest, sondern dass du den Kram verarbeiten solltest, bevor du die Typsicherheit überhaupt verlierst. In dem Moment, in dem du nur noch weißt "Ich hab da eine Datei" solltest du damit auch nur noch Dinge machen wollen, die du mit jeder Datei machen kannst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.07.2007, 23:31 Uhr
DiscordianDude



Mann kann jeden jeden dynamic cast umgehen wenn man vorher über das design nachgedacht hat.
Nehmen wir mal an wir haben eine Klasse namens Daten. Sie enthält grundlegende methoden um informationen über die daten zu bekommen. Jetzt haben wir also die klassen Bild und Text von dieser klasse abgeleitet. Deine funktion zum speichern von daten auf der platte, nimmt natürlich nur objekte die nach dem Bauplan der Klasse Daten erzeugt wurden.
Nun müsste man wohl unterscheiden ob es sich um Text oder Bilder handelt um den filestream evtl mit ios_base::bin zu öffnen oder ggf. einen encoder laden um die bitmap ins jpg format zu bringen. Dazu kann man den dynamic_cast nehmen. Aber man könnte die basis klasse auch mit einer weiteren schnittstelle dekorieren z.b IPersistInfo und deren methoden abstrakt lassen. Implementiert werden sie von Image und Text. Sie können dann, evtl referenzen auf encoder oder io parameter liefern. Somit hättest du deine file write funktion von der art von zu speichernden daten abgekoppelt. Das hätte dir ein dynamic_cast approach nicht gestattet bei dem du für jede weitere agleitung von Daten den quellcode wieder verändern musst.
Die ist nur ein kleines beispiel aber ich denke man sieht warum dynamic_cast nicht immer das gelbe vom ei ist.

beste grüße,
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: