如何使用这些 class 构造函数打印 "ABCDabcd"?
How can I print "ABCDabcd" with these class constructors?
我有以下代码:
#include <iostream>
using namespace std;
class A {
public:
A() { cout << "A"; }
A(const A&) { cout << "a"; }
};
class B : public virtual A {
public:
B() { cout << "B"; }
B(const B&) { cout << "b"; }
};
class C : public virtual A {
public:
C() { cout << "C"; }
C(const C&) { cout << "c"; }
};
class D : B, C {
public:
D() { cout << "D"; }
D(const D&) { cout << "d"; }
};
我想创建一个 D
对象并打印 "ABCDabcd"
。
我试过这个:
int main()
{
D d;
return 0;
}
但是只打印了"ABCD"
,剩下的代码不知道怎么调用
有什么想法吗?
您看到的输出的 ABCD
部分由 A
、B
、C
和 [=16] 的 default constructors 打印=].当 main()
构造 D
对象时,它调用 D
的默认构造函数,后者调用 A
、B
和 C
的默认构造函数。
缺少的输出的 abcd
部分由 A
、B
、C
和 [=16] 的 copy constructors 打印=] 代替。所以 main()
需要 复制 D
对象的副本 以调用 D
的复制构造函数,例如:
int main()
{
D d;
D d2{d}; // or: D d2 = d;
return 0;
}
但是,您会注意到此副本的输出将是 ABCd
,而不是预期的 abcd
。这是因为 D
的复制构造函数不调用 A
、B
或 C
的复制构造函数,而是调用它们的默认构造函数。
要解决这个问题,您需要向每个复制构造函数添加一个 member initialization list 以便调用非默认基构造函数,例如:
class A {
public:
A() { cout << "A"; }
A(const A&) { cout << "a"; }
};
class B : public virtual A {
public:
B() { cout << "B"; }
B(const B &b) : A(b) { cout << "b"; }
};
class C : public virtual A {
public:
C() { cout << "C"; }
C(const C &c) : A(c) { cout << "c"; }
};
class D : public B, C {
public:
D() { cout << "D"; }
D(const D &d) : A(d), B(d), C(d) { cout << "d"; }
};
然后副本将按预期打印 abcd
。
我有以下代码:
#include <iostream>
using namespace std;
class A {
public:
A() { cout << "A"; }
A(const A&) { cout << "a"; }
};
class B : public virtual A {
public:
B() { cout << "B"; }
B(const B&) { cout << "b"; }
};
class C : public virtual A {
public:
C() { cout << "C"; }
C(const C&) { cout << "c"; }
};
class D : B, C {
public:
D() { cout << "D"; }
D(const D&) { cout << "d"; }
};
我想创建一个 D
对象并打印 "ABCDabcd"
。
我试过这个:
int main()
{
D d;
return 0;
}
但是只打印了"ABCD"
,剩下的代码不知道怎么调用
有什么想法吗?
您看到的输出的 ABCD
部分由 A
、B
、C
和 [=16] 的 default constructors 打印=].当 main()
构造 D
对象时,它调用 D
的默认构造函数,后者调用 A
、B
和 C
的默认构造函数。
缺少的输出的 abcd
部分由 A
、B
、C
和 [=16] 的 copy constructors 打印=] 代替。所以 main()
需要 复制 D
对象的副本 以调用 D
的复制构造函数,例如:
int main()
{
D d;
D d2{d}; // or: D d2 = d;
return 0;
}
但是,您会注意到此副本的输出将是 ABCd
,而不是预期的 abcd
。这是因为 D
的复制构造函数不调用 A
、B
或 C
的复制构造函数,而是调用它们的默认构造函数。
要解决这个问题,您需要向每个复制构造函数添加一个 member initialization list 以便调用非默认基构造函数,例如:
class A {
public:
A() { cout << "A"; }
A(const A&) { cout << "a"; }
};
class B : public virtual A {
public:
B() { cout << "B"; }
B(const B &b) : A(b) { cout << "b"; }
};
class C : public virtual A {
public:
C() { cout << "C"; }
C(const C &c) : A(c) { cout << "c"; }
};
class D : public B, C {
public:
D() { cout << "D"; }
D(const D &d) : A(d), B(d), C(d) { cout << "d"; }
};
然后副本将按预期打印 abcd
。