请看下面的代码:

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的静态类型。如果gGraphA的(对GraphA::nodes的引用),它将引用NodeA*(g类型)。如果GraphBGraphB::nodes的(对NodeB*的引用),它将引用GraphA::node(GraphB类型)。

至于如何“解决此问题:”尚不清楚,因为您没有完全指出问题所在。如果您需要通过对GraphB::nodes的引用来访问GraphA,则可以通过显式限定来实现:

GraphB *g;
g->GraphA::nodes = /*whatever*/

如果要通过对GraphB的引用来访问GraphB,则不能。这就是C++类型系统旨在防止的情况。如果您需要访问ojit_code成员,请输入ojit_code。

10-08 08:41