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
};
如果我现在操作structGraphB
的实例并将其强制转换为GraphA
的实例,则强制转换实例中的节点
变量是否与GraphB
的实例中的变量不同
有解决这个问题的模式吗
如果我现在操作structGraphB
的实例并将其强制转换为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*
将是一个令人厌恶的设计。