operatoren erben
-
Hallo .... ich bin am verzweifeln!

Warum, WARUM geht das nicht?
class base { public: int DATA; base& operator=(base o) { DATA = o.DATA; } base operator+(base& o) { base ret; ret.DATA + o.DATA; return ret; } }; class deri : public base { public: deri() {} }; int main() { deri a; deri b; b.DATA = 1; deri c; c.DATA = 2; a = b + c; }GCC 4.1.2 schrieb:
test.cpp: In function »int main()«:
test.cpp:63: Fehler: no match für »operator=« in »a = b.deri::<anonymous>.base::operator+(((base&)(& c.deri::<anonymous>)))«
test.cpp:52: Anmerkung: Kandidaten sind: deri& deri::operator=(deri&)Dankeschön

-
using base::operator=; in deri reinschreiben.
Danke!

Aber warum???
-
Lol ... der Thread wird irgendwie überflüssig ^^
"Weil Zuweisungsoperatoren genauso wenig wie Konstruktoren vererbt werden!"
Aha, ok. Danke

-
- Selbstgespräche sind manchmal auch schön. 
-
dass sie nicht vererbt werden, ist nicht ganz richtig.
der compiler erzeugt aber für jede klasse automatisch einen zuweisungsoperator. stell dir einmal statt dem zuweisungsoperator eine andere funktion vor:struct Base { void foo () { } }; struct Derived : Base { void foo (int) {} };nun erzeug malein objekt vom typ Derived, und versuche, darüber Base::foo aufzurufen:
Derived d; d.foo();das wird nicht funktionieren. und warum nicht? weil die funktion foo(int) in Derived foo() aus Base verdeckt.
zugriff auf Base::foo hast du noch entweder so:d.Base::foo();oder indem du in der klasse Derived selbst sagst, dass du die funktionen aus Base weiterverwenden willst:
struct Derived: Base { using Base::foo; void foo (int) {} };so. nun passiert dasselbe aber mit deiner klasse deri, in der der vom compiler generierte zuweisungsoperator alle zuweisungsoperatoren der basisklasse verdeckt. anschaulich kannst du es dir so vorstellen:
deri a, b, c; c.operator= (a + b); //a + b liefert ein base, deri::operator=(base) ist aber von //deri::operator=(deri const&) verdeckt. es gibt keine //implizite konvertierung von base nach deri. lösung: c.base::operator= (a + b); //oder eben die variante mit using.
-
noch ein nachtrag: zuweisungsoperatoren können sehr wohl vererbt werden. auch virtuelle zuweisungsoperatoren sind möglich.
-
Hi,
kein Widerspruch, sondern nur eine Ergänzung:
queer_boy schrieb:
noch ein nachtrag: zuweisungsoperatoren können sehr wohl vererbt werden. auch virtuelle zuweisungsoperatoren sind möglich.
Damit sind sie in der abgeleiteten Klasse sichtbar ... allerdings kann man dann trotzdem "Match-Probleme" bekommen (weil der Operator ja kein "derived object" als Parameter entgegennehmen kann).
Gruß,
Simon2.