访问隐藏的继承成员

Accessing hidden inherited member

本文关键字:成员 继承 隐藏 访问      更新时间:2023-10-16

请查看以下代码:

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
};

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

有解决这个问题的模式吗?

如果我现在对结构体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*(。

至于如何"解决这个问题":这还不清楚,因为你没有完全说明问题是什么。如果你需要通过引用GraphB来访问GraphA::node,你可以通过显式限定来实现:

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

如果要通过引用GraphA访问GraphB::nodes,则不能。这就是C++类型系统的设计目的。如果您需要访问一个GraphB的member,请执行键入为GraphB的操作。