A
が基本クラスであり、B
がA
から派生するクラス階層を考えてみましょう。なぜ暗黙のコピーコンストラクタが基本クラスのコピーコンストラクタを呼び出し、定義されたコピーコンストラクタが呼び出されないのですか?
コピーコンストラクタがB
で定義されていない場合、コンパイラは1つを合成します。呼び出されると、このコピーコンストラクタはを基本クラスのコピーコンストラクタ(ユーザーが何も提供していない場合でも合成されたもの)を呼び出します。
#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;
}
出力:
ユーザーがB
に独自のコピーコンストラクタを定義する場合
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor
、呼び出されたとき、このコピーコンストラクタは、への呼び出しがない限り、基本クラスのデフォルトコンストラクタ
呼び出します。基本クラスのコピーコンストラクタが明示的に存在します(初期化リストなど)。 #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;
}
出力:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor
私の質問は、なぜユーザー定義のコピーコンストラクタは、デフォルトの動作として、基本クラスのコピーコンストラクタを呼び出すことはありませんか?
これがデフォルトの場合は、そのようなことが起こりたくない場合をどのように指定しますか? – PlasmaHH
@PlasmaHH 'ParentClass()'を初期化子リストに追加します。それはまだかなり矛盾し、私は信じている混乱するだろう。 –
@マークB:確かに、私は彼がそれについて考えて同じ結論に来ることを望んでいた... – PlasmaHH