如何使用这些类构造函数打印“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 部分由 ABCDhttp://spark.apache.org/docs/latest/cluster-overview.html 打印.当 main() 构造 D 对象时,它正在调用 D 的默认构造函数,该构造函数调用 ABC默认构造函数。

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

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

copy constructors

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

要解决这个问题,您需要为每个复制构造函数添加一个 Online demo 以调用非默认的基本构造函数,例如:

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

member initialization list