C ++:对于继承多个类的类,如何从一个类继承某些属性,而从另一个类继承其他属性?

时间:2019-07-19 05:16:21

标签: c++ multiple-inheritance c++98 diamond-problem

有人可以帮我理解从多个类继承的类如何保留一个类的某些属性值以及另一个类的其他某些属性值。

(以及如何针对某些功能执行此操作)


这里有一些代码来描述问题。

在这种情况下,存在钻石继承结构:


-------------基础

---------- / --------------- \

------- / -------------------- \

---母亲-------------父亲

--- \ ----------------------- /

------ \ ------------------ /

--------- \ ------------- /

------------孩子


目标是既继承Father类又继承Mother类(显然继承自Base类),但保留{ {1}}和y中的Father值。我只是不知道该怎么做。

我认为以下代码的问题在于调用构造函数的顺序使得z构造函数会覆盖Mother构造函数正确的Father值在初始化之前。

我认为我可能必须创建一个特殊的z / Mother private构造函数,该构造函数不会初始化protected和一个特殊的{{1} } / Father z构造函数,不会初始化private并显式调用这些构造函数。

但是,如果这是正确的方法或者有更好的方法,请使用idk。有谁知道更好的方法吗?


protected

Mother

1 个答案:

答案 0 :(得分:1)

您不能用这种方式。

virtual inheritance的目的是不重复成员。

知道这一点:

  • Child::xMother::xFather::x 完全是同一变量
  • Child::yMother::yFather::y 完全是同一变量
  • Child::zMother::zFather::z 完全是同一变量

这些只是访问内存堆栈上相同变量的三种方式。因此,当您编写y = Father::y;时,它与您编写y = y;时完全相同,对于其他变量,依此类推。


如果您真的想在不更改设计的情况下完成操作,也许您可​​以在FatherMother中存储一个额外的变量,该变量包含您想要的预设,并且通过范围分辨率将其提供给Child

FatherMotherChild看起来像:

class Father : public virtual Base
{
    protected:
        int preset;

    public:
        Father() : preset(1)
        {
            y = preset;
            z = preset;
        }
};

class Mother : public virtual Base
{
    protected:
        int preset;

    public:
        Mother() : preset(2)
        {
            y = preset;
            z = preset;
        }
};

class Child : public Mother, public Father
{
    public:
        Child()
        {
            y = Father::preset;
            z = Mother::preset;
        }

        int getX() const {return x}
        int getY() const {return y}
        int getZ() const {return z}
};

只需几下更改就可以解决问题。


最后,我要说的是,对于每个需要多重继承的问题,至少还有一个其他解决方案(一种更好的设计)并不暗示多重继承(这只是我的观点)。

因此,我建议您重新考虑您的设计,而不要使用在此建议的解决方法。

相关问题