访问隐藏的继承成员
Accessing hidden inherited member
请查看以下代码:
struct NodeA{
int a;
};
struct NodeB : public NodeA{
int b;
};
struct GraphA{
NodeA* nodes; //array of nodes
};
struct GraphB : public GraphA{
NodeB* nodes; //array of nodes
};
如果我现在对结构体GraphB
的实例进行操作,并将其强制转换为GraphA
的实例,那么强制转换实例中的nodes
变量是否与GraphB
实例中的变量不同?
有解决这个问题的模式吗?
如果我现在对结构体
GraphB
的实例进行操作,并将其强制转换为GraphA
的实例,那么强制转换实例中的nodes
变量是否与GraphB
实例中的变量不同?
是和否。GraphB
的每个实例实际上包含两个名为nodes
的数据成员:一个在GraphA
中声明(其完全限定名称为::GraphA::nodes
(,另一个在GraphB
中声明(完全限定名称是::GraphB::node
(。
当您仅使用名称nodes
时,例如在g.nodes
中,它将取决于g
的静态类型。如果g
是(参考(GraphA
,则它将参考GraphA::nodes
(类型为NodeA*
(。如果g
是(参考(GraphB
,则它将参考GraphB::nodes
(类型为NodeB*
(。
至于如何"解决这个问题":这还不清楚,因为你没有完全说明问题是什么。如果你需要通过引用GraphB
来访问GraphA::node
,你可以通过显式限定来实现:
GraphB *g;
g->GraphA::nodes = /*whatever*/
如果要通过引用GraphA
访问GraphB::nodes
,则不能。这就是C++类型系统的设计目的。如果您需要访问一个GraphB
的member,请执行键入为GraphB
的操作。
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何从另一个文件继承私有成员变量和公共函数
- C++继承更改成员
- 继承和友元函数,从基类访问受保护的成员
- 删除C++继承中虚拟类成员的代码重复
- 成员包含其他继承类的继承类?
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- enable_if继承的成员函数的名称查找错误
- 初始化依赖于子类的继承类的常量类成员
- 继承:调用基类的成员和方法
- 类设计:类成员继承自同一基类
- 使用 CRTP 进行选择性静态成员继承
- 具有'using'的模板模板成员继承
- 结构绑定:与公共数据成员(继承的基类)结合
- 为什么C++继承不允许基类的公共成员继承到派生类的私有成员?
- 静态成员继承和保护
- 是否可以检查是否为类定义了成员函数,即使该成员继承自未知基类
- 混合模板/非模板继承分类和成员继承