C++;私有变量名和继承歧义 这是关于C++(非java)继承和变量名中的歧义。< /P>
假设我处于这种情况:C++;私有变量名和继承歧义 这是关于C++(非java)继承和变量名中的歧义。< /P>,c++,variables,inheritance,private,C++,Variables,Inheritance,Private,假设我处于这种情况: 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声明为private是否足以防止定义派生类时可能出现的不需要的歧义 我知道对B::x使用不
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声明为private是否足以防止定义派生类时可能出现的不需要的歧义
我知道对B::x使用不同的名称是最好的。。。但是假设一个人“心烦意乱”,忘记了私有A::x的存在,那么后果会有多严重
谢谢大家! 调用fct
将作用于A::x
。派生类具有同名的成员变量这一事实与此无关,因为该成员是私有的,并且对它们是隐藏的
如果它能够看到B::x
,那就有点像拥有虚拟数据 调用fct
将作用于A::x
。派生类具有同名的成员变量这一事实与此无关,因为该成员是私有的,并且对它们是隐藏的
如果它能够看到B::x
,那就有点像拥有虚拟数据 由于fct
是非虚拟的,因此它将始终作为自己类的成员处理x
。它不会知道任何其他类中的任何其他x
s
但是,如果fct
被声明为virtual
并在子类中被重写,则将调用子类重写它-并且可以对该子类进行编程,以便使用其他x
,因为fct
是非虚拟的,所以它将始终作为自己类的成员处理x
。它不会知道任何其他类中的任何其他x
s
但是,如果fct
被声明为virtual
并在子类中被重写,则将调用子类重写它-并且可以对该子类进行编程,以便它使用其他x