Betrachten Sie eine Klassenhierarchie, in der A
ist die Basisklasse und B
leitet sich ab von A
.
Wenn der Kopierkonstruktor nicht in B
wird der Compiler eine synthetisieren. Wenn dieser Kopierkonstruktor aufgerufen wird, ruft er den Kopierkonstruktor der Basisklasse (auch die synthetisierte, wenn der Benutzer keine angegeben hat).
#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 seinen eigenen Kopierkonstruktor in B
aufruft, ruft dieser Kopierkonstruktor bei seinem Aufruf der Standardkonstruktor der Basisklasse Es sei denn, ein Aufruf des Kopierkonstruktors der Basisklasse ist ausdrücklich vorhanden (z. B. in der Initialisierungsliste).
#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 ruft der benutzerdefinierte Kopierkonstruktor nicht den Kopierkonstruktor der Basisklasse als Standardverhalten auf?