如何使用这些类构造函数打印"ABCDabcd"?



我有以下代码:

#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部分由ABCD默认构造函数打印。当main()构造D对象时,它调用D的默认构造函数,该构造函数调用ABC的默认构造函数。

输出中缺少的abcd部分由ABCD复制构造函数打印。因此,main()需要复制D对象,以便调用D的复制构造函数,例如:

int main()
{
D d;
D d2{d}; // or: D d2 = d;
return 0;
}

在线演示

但是,您会注意到该副本的输出将是ABCd,而不是预期的abcd。这是因为D的复制构造函数不调用ABC的复制构造函数,而是调用它们的默认构造函数。

要解决此问题,您需要向每个复制构造函数添加成员初始化列表,以便调用非默认的基本构造函数,例如:

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

在线演示

最新更新