访问隐藏的继承成员

时间:2016-09-19 08:24:25

标签: 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
};

如果我现在对struct GraphB的实例进行操作并将其强制转换为GraphA的实例,那么nodes变量在转换实例中是不同的在GraphB

的例子中

是否有解决此问题的模式?

1 个答案:

答案 0 :(得分:3)

  

如果我现在对struct GraphB的实例进行操作并将其强制转换为GraphA的实例,那么nodes变量在转换实例中是不同的在GraphB

的例子中

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

当您仅使用名称nodes时,例如在g.nodes中,它将取决于g的静态类型。如果g是(引用)GraphA,则会引用GraphA::nodesNodeA*类型)。如果g是(引用)GraphB,则会引用GraphB::nodes(类型NodeB*)。

至于如何解决这个问题:"这个不清楚,因为你没有明确说明问题所在。如果您需要通过对GraphA::node的引用来访问GraphB,则可以通过明确的限定来执行此操作:

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

如果您想通过GraphB::nodes的引用访问GraphA,则无法访问。这就是C ++类型系统旨在防止的。如果您需要访问GraphB的成员,请输入GraphB类型的内容。