Erben von Konstruktoren
Warum funktioniert dieser code:
class A
{
public:
explicit A(int x) {}
};
class B: public A
{
};
int main(void)
{
B *b = new B(5);
delete b;
}
Dazu führen, dass diese Fehler:
main.cpp: In function 'int main()': main.cpp:13: Fehler: keine passende Funktion für Aufruf von 'B::B(int)' main.cpp:8: Anmerkung: Kandidaten sind: B::B() main.cpp:8: Hinweis: B::B(const B&)
Sollte nicht B Erben Ein Konstruktor?
(mit gcc)
InformationsquelleAutor der Frage Sydius | 2008-12-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C++03 standard-Konstruktoren können nicht vererbt werden und Sie müssen die Erben Sie Sie manuell durch Aufruf von base die Umsetzung auf Ihrer eigenen. Wenn dein compiler unterstützt C++11-standard, es ist eine Konstruktor-Vererbung. Für mehr siehe Wikipedia C++11-Artikel. Mit dem neuen standard-Sie schreiben:
InformationsquelleAutor der Antwort Suma
Konstruktoren werden nicht vererbt. Sie sind berufen, implizit oder explizit, von der Kind-Konstruktor.
Erstellt der compiler einen default-Konstruktor (ohne Argumente) und eine Standard-copy-Konstruktor mit einem argument, das ist ein Verweis auf die gleiche Art). Aber wenn Sie möchten, dass ein Konstruktor wird akzeptieren, dass ein int zu können, definieren Sie es explizit.
UPDATE: In C++11, Konstruktoren vererbt werden können. Siehe Suma-Antwort für details.
InformationsquelleAutor der Antwort Avi
Müssen Sie explizit definieren Sie den Konstruktor in B und explizit den Konstruktor aufrufen, für die Eltern.
oder
InformationsquelleAutor der Antwort grepsedawk
Dies ist gerade aus Bjarne Stroustrup ' s Seite:
Wenn Sie so wählen, können Sie noch Schießen selbst in den Fuß durch die Erben von Konstruktoren in einer abgeleiteten Klasse, in die Sie definieren, neue member-Variablen benötigen Initialisierung:
InformationsquelleAutor der Antwort nenchev
Richtige Code
Fehler ist b/c der Klasse B hat keine parameter-Konstruktor und zweitens sollte es haben Basis-Klasse-Initialisierung Aufruf der Konstruktor der Basisklasse parameter-Konstruktor
InformationsquelleAutor der Antwort Iqbal Haider
Wie über die Verwendung einer template-Funktion zu binden alle Konstruktoren?
InformationsquelleAutor der Antwort Pradu