A
'un temel sınıf ve'dan B
türetimlerinin olduğu bir sınıf hiyerarşisi düşünün.Neden örtülü kopya oluşturucu, temel sınıf kopyalama yapıcısını çağırır ve tanımlı kopya kurucusu çalışmıyor?
Kopya kurucusu, B
'da tanımlanmamışsa, derleyici bir tanesini sentezleyecektir. Çağrıldığında, bu kopya kurucusu temel sınıf kopyalama kurucusu'u (kullanıcı tarafından sağlanmamışsa, sentezlenen bile olsa) çağırır.
#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;
}
Çıktı:
kullanıcı B
kendi kopya kurucu tanımlıyorsa
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor
, çağrıldığında, bu kopya yapıcı bir çağrı sürece, temel sınıf varsayılan yapıcı
arayacak temel sınıf kopya kurucusu açık bir şekilde mevcuttur (örneğin başlangıç listesinde). #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;
}
Çıktı:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor
Sorum, neden kullanıcı tanımlı kopya yapıcı varsayılan davranış olarak temel sınıf kopya kurucu çağırmaz mı?
Varsayılan olarak böyleyse, bunun olmasını istemeyeceğiniz durumu nasıl belirlersiniz? Başlatıcı listesinde – PlasmaHH
@ PlasmaHH 'ParentClass()'. Bu yine de tutarsız ve kafa karıştırıcı olabilir inanıyorum. –
@MarkB: Gerçekten de, bunu düşünürken aynı sonuca varmayı umuyordum ... – PlasmaHH