Inheritance from parents with same members(从具有相同成员的父母那里继承遗产)
问题描述
我在访问多重继承下的父级成员(同名)时遇到问题。我有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;
}
Main的输出为
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::_Hitpoint?如果我在每个父类中都有两个成员,该怎么办?DiamondTrap可以继承Fragtrap的其中一个和SCravTrap的一个吗?我该怎么做?
推荐答案
由于您使用了virtual
继承,因此只有一个ClapTrap
,并且只有一个_hitpoints
。
不能让_hitpoints
变量携带多个值。
首先构造ClapTrap
,赋值0
,然后构造ScravTrap
,赋值1
,最后构造FragTrap
,将2
-all赋给同一个_hitpoints
变量。
创建
DiamondTrap
的实例时,我只想调用ClapTrap
的构造函数一次。
这就是您现在要做的。
如何既可以执行此操作,又可以同时访问
ScravTrap::_hitpoints
和FragTrap::_hitpoints
?
您不能。您必须选择其中一个。
如果没有virtual
继承,您将有两个构造函数调用和ScravTrap::_hitpoints
和FragTrap::_hitpoints
。
使用virtual
继承,您将有一个构造函数调用,并且只有一个_hitpoints
。
这篇关于从具有相同成员的父母那里继承遗产的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从具有相同成员的父母那里继承遗产


基础教程推荐
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- CString 到 char* 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 初始化列表*参数*评估顺序 2021-01-01