【发布时间】:2021-11-01 03:05:26
【问题描述】:
我在访问多重继承下父母的成员(同名)时遇到问题。我有 4 个类(经典钻石问题)定义如下:
class ClapTrap
{
public:
ClapTrap(void)
{ _hitpoints = 0; }
~ClapTrap() { }
protected:
int _hitpoints;
};
class ScravTrap : public virtual ClapTrap
{
public:
ScravTrap(void)
{ _hitpoints = 1; }
~ScravTrap() { }
};
class FragTrap : public virtual ClapTrap
{
public:
FragTrap(void)
{ _hitpoints = 2; }
~FragTrap() { }
};
class DiamondTrap : public ScravTrap, public FragTrap
{
public:
DiamondTrap(void)
{
std::cout << ScravTrap::_hitpoints << std::endl;
std::cout << FragTrap::_hitpoints << std::endl;
}
~DiamondTrap() { }
};
int main()
{
DiamondTrap d;
}
我的主要输出是
2
2
我希望这个输出是
1
2
因为我第一次打印 DiamondTrap 的 ScravTrap::_hitpoints 成员(并且 ScrapTrap::_hitpoints 被初始化为 1),而我第二次打印 DiamondTrap 的 FragTrap::_hitpoints 成员(之前已经初始化到 2)。我知道 DiamondTrap 继承了两个 _hitpoint 成员,但我怎样才能正确访问它们?
注意即使我在 DiamondTrap 类的公共部分的开头写了using ScravTrap::_hitpoints,输出仍然是一样的。为什么会这样?
编辑 一些答案提到虚拟继承只生成一个基类的副本。在创建 DiamondTrap 的实例时,我只想调用一次 ClapTrap 的构造函数。我怎样才能做到这一点并且还可以访问 ScravTrap::_hitpoints 和 FragTrap::_hitpoints?如果我在每个父类中有两个成员怎么办? DiamondTrap 可以从 FragTrap 继承其中一个,从 ScravTrap 继承其中之一吗?我该怎么做?
【问题讨论】:
-
virtual继承有什么作用? -
...这意味着...
-
@TedLyngmo:我很确定 StoryTeller-UnslanderMonica 知道答案 :-) 问题是针对 OP 的。改进了Rubber duck :-)
-
@TedLyngmo - 坡定律。每次:)
-
“我怎样才能做到这一点,同时还能访问
ScravTrap::_hitpoints和FragTrap::_hitpoints?” 要么你有虚拟继承,要么你有ScravTrap::_hitpoints和FragTrap::_hitpoints是同一个变量,或者您使用非虚拟继承(“Y 继承”)拥有 2 个ClapTrap(因此每个构造函数调用,总共 2 个)。
标签: c++ inheritance multiple-inheritance