1

我目前正在尝试构建使用多重继承的类层次结构。我有类A,和B,相关如下:CD

struct A
{
    int a;
    A(int a_) : a(a_) {}
};

struct B : virtual A
{
    int b;
    B(int a_, int b_) : A(a_), b(b_) {}
};

struct C : virtual A
{
    C(int a_) : A(a_) {}
};

struct D : B , C
{
    D(int a_, int b_) : A(a_), B(a_, b_) , C(a_) {}
};

我的问题是D将参数传递给B并且C不需要,我想找到一种更好的方法来做到这一点。

我发现最好的方法是先用D初始化,然后用初始化,然后用初始化(即使参数无关紧要)和 'link'的实例to的实例。BB(a_, b_)BAA(a_)CC(a_)CABA

我的意思是内存布局D看起来像这样:

内存布局

WhereC的基类A将位于B.

我已经尝试了多种方法在 C++ 中执行此操作,但我还没有找到一种可以让我更改C's所在位置的A方法,我也不知道是否可能。

我的问题是这是否可以使用继承或其他工具在 C++ 中实现?


即使有可能,我仍然会遇到一个问题,即必须初始化两者BC使用一个不会做任何事情的“虚拟”参数,这对于 int 来说很好,但对于更“重”的东西来说就不行了。

我想要的是,当从Bor继承时C,您将使用一个空的构造函数来初始化它,并在正常创建它时使用另一个构造函数,如下所示:

struct A
{
    int a;
    A(int a_) : a(a_) {}
};

struct B : virtual A
{
    int b;
    B(int a_, int b_) : A(a_), b(b_) {}

    protected:

    // The A initialization will never get called
    B(int b_) : A(0), b(b_) {}
};

struct C : virtual A
{
    C(int a_) : A(a_) {}

    protected:

    // This initialization will never get called
    C() : A(0) {}
};

struct D : B , C
{
    D(int a_, int b_) : A(a_), B(b_) , C() {}
};

唯一的问题是我不确定这有什么我应该注意的副作用,或者即使它有效,我也想不出一种方法来很好地测试它。

我不确定是否可以接受同时提出两个问题,我相信它们一起有意义,但如果不是,我会将其编辑出来并作为不同的问题提出。

编辑1:

关于副本,该答案表明未使用的参数将不会用于初始化两个派生类中的最基类。

我的第二个问题是如何避免向两个派生类提供未使用的参数,因为参数可能非常大并且需要很长时间和内存复制。我提供了一个可能的解决方案,但我不确定这是否真的解决了我的问题以及它会产生什么副作用。

因此,更具体地说,我的第二个问题是这种避免向两个派生类提供参数的实现是好的还是我在构建它时没有考虑到的任何副作用?

4

0 回答 0