Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme mit Basisklasse und Member von Abgeleiteten Klassen

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
27.12.2009, 16:12 Uhr
~Gafabi
Gast


Hallo,

ich habe ein Problem in meinem Design. Ich möche auf die member eines Template-basiertes Member-Objekts einer abgeleiteten Klasse in der main zugreifen doch das geht so nicht.

Als Erklärung hilft vielleicht folgender Pseudocode:


C++:
class Mtx
{
       public:
            Mtx() {mtx_i = 9;}
            int mtx_i;
            double mtx_d;
};
class Base
{
     public:
          virtual ~Base() {};
};
class Derived1 : public Base
{
     public:
          Derived1() { mtx = NULL;}
          Mtx<double> * mtx;
};
class Derived2 : public Base
{
     public:
          Derived2() { mtx = NULL;}
          Mtx<int> * mtx;
};

int main(void)
{
     Base *base = NULL;
     int var = 0; // var wird unterschiedlich gesetzt: LaufzeitPolymorphie    

     if (var == 0) base = new Derived1();
     else base = new Derived2();

     // Jetzt möchte ich auf mtx_a oder mtx_i vom Pointer auf Mtx zugreifen
     // Nur weiß ich nicht genau wie. Ich möchte nicht für jeden einzelnen
    // Member von Mtx eine access-funktion innerhalb der Klasse base machen
   // das wäre doch wahnsinn. Geht das nicht irgendwie?
   std::cout << base->mtx_i << std::endl;

     return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.12.2009, 16:52 Uhr
0xdeadbeef
Gott
(Operator)


Aaaaalso, wo anfangen?

Zunächst mal ist Mtx keine Klassenvorlage, du kannst sie also nicht wie eine benutzen.

Zweitens haben Derived1 und Derived2 keinen Member mtx_i, sondern Members mtx, die, wenn wir für den Moment mal so tun, als sei Mtx eine Klassenvorlage, verschiedene Typen mit verschiedenen Schnittstellen haben, sich also nicht über einen Kamm scheren lassen.

Drittens hat Base diese Member nicht, also lassen sie sich durch einen Base-Zeiger auch nicht ansprechen.

Viertens hast du da eine öffentliche Basisklasse, die kein Interface zur Verfügung stellt - was soll das bringen?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.12.2009, 17:03 Uhr
~Gafabi
Gast


Ich habe mir so einiges überlegt und erschlage Punkte 1-3.

"Viertens hast du da eine öffentliche Basisklasse, die kein Interface zur Verfügung stellt - was soll das bringen?"

Diesen Punkt würde ich gerne noch diskutieren: Was meinst du damit genau ich hab kein Interface?
Meinst du ich hab keine Methoden in der Basisklasse? Allein für Laufzeitpolymorphie wäre das doch so valide oder verstehe ich was falsch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.12.2009, 19:09 Uhr
0xdeadbeef
Gott
(Operator)


Naja, deine Basisklasse hat nur einen virtuellen Destruktor; sie stellt keinerlei Funktionalität in Aussicht. Das bedeutet, die Basisklasse stellt keinerlei Anforderungen an abgeleitete Klassen, und dementsprechend kannst du mit einem Zeiger auf die Basisklasse auch nur genau das einfordern - nichts.

Sauberes, objektorientiertes Design erwartet, dass die Basisklasse das Interface zur Verfügung stellt, das alle abgeleiteten Klassen dann erfüllen müssen. Auf die Art lässt sich jede Instanz einer abgeleiteten Klasse in einen Basisklassenzeiger bzw. -referenz stopfen und trotzdem sinnvoll benutzen, und darum geht es ja bei der ganzen Geschichte.

Es ist zwar prinzipiell möglich, über RTTI die abgeleitete Klasse zurückzufordern, wenn du weißt, was sich hinter dem Zeiger verbirgt, aber das ist ein wirklich, wirklich, wirklich, wirklich, wirklich dreckiger Hack, der noch vorsichtiger benutzt werden sollte als goto o.ä.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: