Warum ruft der implizite Kopierkonstruktor den Kopierkonstruktor der Basisklasse auf und der definierte Kopierkonstruktor nicht?
Betrachten Sie eine Klassen-Hierarchie, wo A
ist die Basisklasse und die B
stammt aus A
.
Wenn die Kopie-Konstruktor definiert ist, nicht in B
der compiler synthetisieren. Wenn Sie aufgerufen wird, diese Kopie-Konstruktor rufen die Basisklasse copy-Konstruktor (selbst synthetisiert, wenn keine durch den Benutzer).
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
Ausgabe:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor
Wenn der Benutzer definiert seine eigenen copy-Konstruktor in B
wenn Sie aufgerufen wird, diese Kopie-Konstruktor rufen die Basisklasse Standard-Konstruktores sei denn, ein Aufruf der Basisklasse kopierkonstruktor ist explizit vorhanden (z.B. in der Initialisierungs-Liste).
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
B(const B& rhs) {
std::cout << "B::Copy constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
Ausgabe:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor
Meine Frage ist, warum werden nicht die Benutzer-definierten copy-Konstruktor-Aufruf der Basisklasse copy-Konstruktor wird als default-Verhalten?
InformationsquelleAutor der Frage Vincenzo Pii | 2012-02-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist nur die Art und Weise der implizite Kopier-Konstruktor definiert (es wäre nicht sinnvoll, den Aufruf der Standard). Sobald Sie definieren, jeder Konstruktor (kopieren oder anderweitig) seine normale automatische Verhalten ist auf die Standard-Eltern-Konstruktor, so wäre es inkonsistent zu ändern, dass für einen bestimmten Benutzer-definierten Konstruktor.
InformationsquelleAutor der Antwort Mark B
Alle base-Kind-Konstruktoren aufrufen des übergeordneten Standard-Konstruktor. Dies ist, wie der standard definiert ist. Wie Sie wies darauf hin, wenn Sie wollten, dass die Basis-Klasse B aufrufen, Einen copy-Konstruktor müssen Sie explizit danach Fragen
Dies ist so, weil der compiler nicht wissen kann, für jeden anderen Konstruktor die constuctor für das übergeordnete genannt werden sollte und daher haben wir die default-Konstruktoren Für alle anderen müssen Sie ausdrücklich erklären.
InformationsquelleAutor der Antwort Lefteris
Den einfachen (vielleicht Banale) Antwort ist, weil Sie nicht sagen, es zu. Da Sie schreiben das abgeleitete copy-Konstruktor, Sie vollständig zu kontrollieren, wie es sich verhält. Die Nichtangabe eines Anrufs an der Basis, und der compiler generiert code zur Initialisierung der Basis-Klasse durch den Aufruf der Basisklassen-default-Konstruktor.
InformationsquelleAutor der Antwort Lou