请看下面的代码:
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
实例中的变量不同?是否有解决此问题的模式?
最佳答案
是的,没有。每个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::nodes
的引用来访问GraphA
,则可以通过显式限定来实现:
GraphB *g;
g->GraphA::nodes = /*whatever*/
如果要通过对
GraphB
的引用来访问GraphB
,则不能。这就是C++类型系统旨在防止的情况。如果您需要访问ojit_code成员,请输入ojit_code。