这是关于变量名中的C ++(而不是java)继承和歧义。
假设我处于这种情况:
class A{
public:
void fct(){do something with x;}
private:
int x;
};
class B: public A{
private:
int x;
};
如果我定义派生类的一些实例
B foo;
然后致电
foo.fct();
fct()
会A::x
还是B::x
?
我希望它能在A::x
上采取行动。我想知道在类A中将x声明为私有是否足以使其在定义派生类时可能出现的非需要歧义。
我知道只为B::x
使用不同的名称是最好的事情......但是假设一个人“分散注意力”并忘记私有A::x
存在,那有多糟糕后果会是什么?
谢谢!
答案 0 :(得分:3)
由于fct
是非虚拟的,因此它始终将x
作为其自己的类的成员来处理。在任何其他classess中,它都不会知道任何其他x
。
但是,如果fct
被声明为virtual
并在子类中被覆盖,则会调用子覆盖,而是调用它 - 这个可以编程,以便它可以使用其他x
}。
答案 1 :(得分:1)
致电fct
将对A::x
采取行动。派生类具有相同名称的成员变量的事实是无关紧要的,因为该成员是私有的并且对它们是隐藏的。
如果它能够看到B::x
那么这就像拥有虚拟数据一样!