Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme mit Vererbung / Polymorphie

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
31.07.2005, 15:53 Uhr
blackbox



Hallo

Wenn ich die beiden Klassen CKlasseA und CKlasseB instanziere, dann kann ich Atmen() und Pusten() nicht ausführen, da der Compiler die Methoden nicht findet. Wenn ich die rein virtuelle Funktion Atmen() aufrufe, dann geht das. Atmen() und Pusten() möchte ich jedoch nicht in der Base-Class implementieren, da sie nur für die entsprechenden Abgeleiteten Klassen gültig sein sollen.

Was mache ich hier falsch?


C++:
class CBase
{
protected:
    CBase();    
public:
    virtual ~CBase();
    virtual void Atmen() = 0;
};




C++:
class CKlasseA : public CBase
{    
public:
     CKlasseA();
    virtual ~CKlasseA();
    void Atmen() { ...machwas... };
    void SchnellAtmen();
};




C++:
class CKlasseB : public CBase
{    
public:
     CKlasseB();
    virtual ~CKlasseB;
    void Atmen() { ...machwas... };
    void Pusten();
};


#################### Hauptprogramm ####################

C++:
#include "CKlasseA.h"
#include "CKlasseB.h"

int main()
{
    // Definition des Pointers
    CBase* pExample;
    pExample = new CKlasseA();
    pExample->Atmen();
    pExample->SchnellAtmen();
    delete pExample;
    
    pExample = new CKlasseB();
    pExample->Atmen();
    pExample->Pusten();
    delete pExample;
    
    return 0;    
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.07.2005, 18:29 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


du musst entweder in der Baseclass die funktionen bekannt machen, oder jeweils in die Subclass casten, also z.b


C++:
pExample->SchnellAtmen(); // hier unbekannt, da pExample aus CBase, und das kein SchnellAtmen hat




C++:
((CKlasseA*)pExample)->SchnellAtmen(); // das geht, da er nun annimmt das pExample zur Klasse CKlasseA gehört.


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.07.2005, 18:50 Uhr
blackbox



Danke vielmals!

Gibt es irgend einen unterschied zwischen:

1. dynamic_cast<CKlasseA*>(pExample)->SchnellAtmen(); und
2. ((CKlasseA*)pExample)->SchnellAtmen();

?? Wenn ich den Code ausführe funktionieren beide? Ich hatte es zuvor nur mit einem

dynamic_cast<CKlasseA*>(pExample);

probiert und dachte dann, dass pExample nun permanent auf CKlasseA gecastet wurde, aber dem ist ja wohl nicht so.


Gruss Blackbox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.07.2005, 19:06 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


dynamic_cast ist halt sicherer, das gibt NULL zurück wenn das angeforderte Objekt eben nicht zum Speicherbereich passt. arbeitet aber z.b auch nicht korrekt wenn man z.b sowas hat:


C++:
struct A
{
  B var;
  // ... sonstige
};


B test;
void *ptr = (void*)&test;

A *p = dynamic_cast<A*>(ptr);



das gibt trotzdem einen pointer zurück, nur sind die elemente alle NULL, das find ich etwas scheisse

wenn ich nen C-Cast mache (eben das was ich dir gesagt hatte) ist das selbe ergebnis, also kann ich mir den dynamic_cast schenken
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.07.2005, 19:16 Uhr
blackbox



Hör ich da leichte Verbitterung raus? ;-)

Danke auf jeden Fall...hat mir sehr weitergeholfen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.07.2005, 20:07 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von blackbox:
Hör ich da leichte Verbitterung raus? ;-)


das klang nur so
--
class God : public ChuckNorris { };
 
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: