请查看以下代码:
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
的实例,那么nodes
变量在转换实例中是不同的在GraphB
?
是否有解决此问题的模式?
答案 0 :(得分:3)
如果我现在对struct
的例子中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*
)。
至于如何解决这个问题:"这个不清楚,因为你没有明确说明问题所在。如果您需要通过对GraphA::node
的引用来访问GraphB
,则可以通过明确的限定来执行此操作:
GraphB *g;
g->GraphA::nodes = /*whatever*/
如果您想通过GraphB::nodes
的引用访问GraphA
,则无法访问。这就是C ++类型系统旨在防止的。如果您需要访问GraphB
的成员,请输入GraphB
类型的内容。