[C++] Zugriff auf Basisklasse

Onkel Schuppig

Erfahrenes Mitglied
Hallo zusammen,
unten stehender Code soll folgendes ausgeben:
A = 1, B = 2
Kann mir evtl. jemand das Brett vom Kopf entfernen?:)

Grüße Onkel Schuppig

Code:
struct A {
  A(int a0) : a(a0) { }
  int a;
  friend ostream& operator<<(ostream& os, A& c) { os << "A = " << c.a; return os; }
};

struct B : A {
  B() : A(1), b(2) { }
  int b;
  // in der nächsten Zeile ist irgendetwas falsch:
  friend ostream& operator<<(ostream& os, B& c) { os << A << ", B = " << c.b; return os; }
};

B test;
cout << test << endl;
 
Hi.

Wie wär's denn damit:
C++:
A tmp(static_cast<A>(c));
os << tmp << ", B = " << c.b; return os;

Wenn du die temp. Variable eliminieren willst, mußt du eine konstante Referenz als 2. Parameter an den operator<< übergeben.

Gruß
 
Das gleiche Problem einfacher beschrieben:
Wie kann man den Basisteil einer abgeleiteten Klasse neu zuweisen?
Code:
struct A { };

struct B : A { };

B s1;
A s2;

s1 = s2;     // das klappt nicht ...
s1.A = s2;    // das auch nicht ...
s1 = (A)s2;    // und das erst recht nicht.
 
Das gleiche Problem einfacher beschrieben:
Wie kann man den Basisteil einer abgeleiteten Klasse neu zuweisen?
Code:
struct A { };

struct B : A { };

B s1;
A s2;

s1 = s2;     // das klappt nicht ...
s1.A = s2;    // das auch nicht ...
s1 = (A)s2;    // und das erst recht nicht.
Was du hier versuchst nennt sich Down-Cast und das funktioniert natürlich nicht, denn ein B ist zwar ein A, aber ein A ist lange noch kein B. So läßt sich ein A eben auch nicht an ein B zuweisen; umgekehrt natürlich schon.

Du mußt in der Klasse B schon explizit definieren, was passieren soll wenn ein A einem B zugewiesen wird. Das heißt du mußt den B& operator= (const A&) definieren.

Das brauchst du für dein Problem vom Anfang aber nicht zu tun, denn da mußt du einen Up-Cast machen.

Gruß
 
Ah ja, das mit dem B::operator=(const A&) ist die Lösung.
Auch die Sache mit dem operator<< funktionabelt nun prächtig.:)

Vielen Dank! Sicht ist wieder frei.:-)
 
Zurück