consideri una gerarchia di classi in cui A
è la classe base e B
deriva da A
.Perché il costruttore di copia implicito chiama il costruttore di copia della classe base e il costruttore di copie definito non lo fa?
Se il costruttore di copia non è definito nel B
, il compilatore sintetizzerà uno. Quando viene richiamato, questo costruttore di copia chiamerà il costruttore di copia della classe di base (anche quello sintetizzato, se nessuno è stato fornito dall'utente).
#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;
}
uscita:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor
Se l'utente definisce la propria costruttore di copia in B
, quando invocato, questo costruttore di copia chiamerà il costruttore di base classe predefinita, a meno che una chiamata a il costruttore di copia della classe base è esplicitamente presente (ad es. nell'elenco di inizializzazione).
#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;
}
uscita:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor
La mia domanda è: perché non il costruttore di copia definito dall'utente chiamare la copia costruttore della classe base, come un comportamento di default?
Se fosse così per impostazione predefinita, come è possibile specificare il caso in cui non si vuole che ciò accada? – PlasmaHH
@PlasmaHH 'ParentClass()' nell'elenco di inizializzazione. Sarebbe comunque abbastanza inconsistente e confuso credo. –
@ MarkB: In effetti, speravo che arrivasse alla stessa conclusione quando ci pensava ... – PlasmaHH