C++ 访问隐藏的继承成员

C++ 访问隐藏的继承成员,c++,inheritance,casting,C++,Inheritance,Casting,请查看以下代码: 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 }; 如果我现在操作structGraphB的实例并将其强制转换为GraphA的实例,则强制转

请查看以下代码:

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
};
如果我现在操作struct
GraphB
的实例并将其强制转换为
GraphA
的实例,则强制转换实例中的
节点
变量是否与
GraphB
的实例中的变量不同

有解决这个问题的模式吗

如果我现在操作struct
GraphB
的实例并将其强制转换为
GraphA
的实例,则强制转换实例中的
节点
变量是否与
GraphB
的实例中的变量不同

是和否。
GraphB
的每个实例实际上包含两个名为
节点的数据成员:一个在
GraphA
中声明(其完全限定名为
::GraphA::nodes
),另一个在
GraphB
中声明(其完全限定名为
::GraphB::node

如果只使用名称
节点
,例如在
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
的memeber,在您的代码中执行键入为
GraphB

的操作,
GraphB
将必须有一组节点(
GraphA::nodes
GraphB::nodes
),您真的需要这些吗?为什么不使用<代码>图形::节点<代码> >(a <代码> NoDEA*/Cux>可以指向<代码> NodeA < /C> >或< < NodeB >代码>,因为<代码> NodeB < /COD>继承了<代码> NodeA < /C> >与您的问题无关,但是如果您想要C++中的结构数组,首先使用替代原始指针。虽然
NodeA
NodeB
可能有关联,但我看不到
GraphA
GraphB
之间有相同的关系。也许你应该重新考虑你的设计?如果在<代码> GraphA < /代码>和<代码>图形B >代码>之间有一些共同的属性或成员函数,那么请考虑使用一个通用的和通用的基类<代码>图。你甚至可以制作一个模板化的
Graph
类,并将
GraphA
GraphB
作为模板化的
Graph
类的类型别名。这只是一个示例代码,我忘了说对不起。好的,在继承的变量中有两个“节点”成员。我正在调试一个软件,发现了这样的设计,我也很好奇。泛型类将不起作用,因为GraphB中实现的函数重写GraphA的函数,并基于其他节点类型执行其他操作。我认为删除struct GraphB的nodes成员并强制转换节点将是解决方案。谢谢大家
如果您想通过对GraphA的引用来访问GraphB::nodes,您不能。一个选项是获取节点的虚拟方法。@GillBates好的,再次回答是和否。您可以访问指针值,但它很可能被键入为
NodeA*
。因为在
GraphA
内部有一个虚拟返回的
NodeB*
将是一个令人厌恶的设计。