Vererbung
-
Ich hab da mal ne Frage:
class p1 { p1(int a, double b); }class f1 : public p1 { f1(int a, double b, double c); }p1 ist die Ursprungsklasse, bei der ich im Konstruktor a und b angeben muss.
Jetzt erbe ich mir aus der Klasse f1 das zusätzlich im Konstruktor neben a und b noch c angegeben haben muss.
Beim compilieren kommt die Fehlermeldung "Kein geeigneter Standardkonstruktor gefunden.Wie mach ich das, das ich a und b aus f1 auf a und b in p1 verweise?
-
class p1 { p1(int a, double b); } class f1 : public p1 { f1(int a, double b, double c); }wenn deine klassen exakt so aussehen, dann sollte du mal paar c++ OOP bücher/tutorals durchgehen.
hier mal die lösung... ( ich denke das a und b aus P1 in F1 vererbrt werden sollen!?
class p1 { protected: int m_a,m_b; public: p1(int a, double b) :m_a(a),m_b(b); }; class f1 : public p1 { int m_c; f1(int a, double b, double c) , p1(a,b) , m_c(c){ } };
-
update:
class p1 { protected: int m_a; double m_b; public: p1(int a, double b) :m_a(a),m_b(b);{ } }; class f1 : public p1 { double m_c; public: f1(int a, double b, double c) , p1(a,b) , m_c(c){ } };
-
Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
etsmart schrieb:
Beim compilieren kommt die Fehlermeldung "Kein geeigneter Standardkonstruktor gefunden.
Wie mach ich das, das ich a und b aus f1 auf a und b in p1 verweise?
Du rufst in der Initialisierungsliste von f1 den Konstruktor von p1 auf
class f1 : public p1 { f1(int a, double b, double c); } f1::f1(int a, double b, double c) : p1(a, b) //irgendwas noch mit c machen { }
-
Wenn die Basisklassenelemente unter protected stehen, brauchst den Konstruktor nicht in der Initialisierungsliste aufrufen, kannst doch direkt auf sie zugreifen.
-
Quellcode schrieb:
Wenn die Basisklassenelemente unter protected stehen, brauchst den Konstruktor nicht in der Initialisierungsliste aufrufen, kannst doch direkt auf sie zugreifen.
Von der Objektorientierung her ist ein Initialisieren im eigenen Konstruktor jedoch besser. Da ist auch die Gefahr für Design-Fehler kleiner.
Ausserdem ist ein Initialisieren in der Initialisierungsliste des Konstruktors einer nachträglichen Zuweisung vorzuziehen (z.B. bei
const-Elementen oder Referenzen sogar die einzige Möglichkeit).
-
ja auf jeden fall ist die Methode des Benutzens von Konstruktoraufrufen vorzuziehen. hatte vergessen hinzu schreiben, dass es natürlich auch möglich ist es anders machen zu können.