有人可以帮我理解从多个类继承的类如何保留一个类的某些属性值以及另一个类的其他某些属性值。
(以及如何针对某些功能执行此操作)
这里有一些代码来描述问题。
在这种情况下,存在钻石继承结构:
-------------基础
---------- / --------------- \
------- / -------------------- \
---母亲-------------父亲
--- \ ----------------------- /
------ \ ------------------ /
--------- \ ------------- /
------------孩子
目标是既继承Father
类又继承Mother
类(显然继承自Base
类),但保留{ {1}}和y
中的Father
值。我只是不知道该怎么做。
我认为以下代码的问题在于调用构造函数的顺序使得z
构造函数会覆盖Mother
构造函数正确的Father
值在初始化之前。
我认为我可能必须创建一个特殊的z
/ Mother
private
构造函数,该构造函数不会初始化protected
和一个特殊的{{1} } / Father
z
构造函数,不会初始化private
并显式调用这些构造函数。
但是,如果这是正确的方法或者有更好的方法,请使用idk。有谁知道更好的方法吗?
protected
Mother
答案 0 :(得分:1)
您不能用这种方式。
virtual inheritance的目的是不重复成员。
知道这一点:
Child::x
,Mother::x
和Father::x
完全是同一变量Child::y
,Mother::y
和Father::y
完全是同一变量Child::z
,Mother::z
和Father::z
完全是同一变量这些只是访问内存堆栈上相同变量的三种方式。因此,当您编写y = Father::y;
时,它与您编写y = y;
时完全相同,对于其他变量,依此类推。
如果您真的想在不更改设计的情况下完成操作,也许您可以在Father
和Mother
中存储一个额外的变量,该变量包含您想要的预设,并且通过范围分辨率将其提供给Child
。
Father
,Mother
和Child
看起来像:
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}
};
只需几下更改就可以解决问题。
最后,我要说的是,对于每个需要多重继承的问题,至少还有一个其他解决方案(一种更好的设计)并不暗示多重继承(这只是我的观点)。
因此,我建议您重新考虑您的设计,而不要使用在此建议的解决方法。