父级和子级中的c ++同名成员

时间:2018-07-05 05:26:17

标签: c++

如果在c++中,如果父级和子级类的成员具有相同的名称,则我在c++编程中遇到了问题:

#include <iostream>
using namespace std;

class A{
private:
    int x;
public:
    A(){x=1;}
    void SetX(int i)
    {
        x=i;
    }

};

class B:public A{
private:
    int x;
public:
    B(){}
   int GetX()
    {
        return x;
    }
};
int main() {
    B b;
    cout<<b.GetX()<<endl;
    b.SetX(10);
    cout<<b.GetX()<<endl;
    return 0;
}

程序结果为:

  

-858993460
  -858993460

为什么?返回哪个x
感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

B::GetX将始终返回B::x

A::SetX将始终设置A::x

并且由于B::x从未初始化,因此其值将不确定,并且打印该值将导致undefined behavior

答案 1 :(得分:1)

在C ++中,子类中的符号被定义为“隐藏”父类中具有相同名称的任何符号。这样一来,代码所指代的符号就不会模糊。请注意,这是不可取的,因为您的代码正好会造成混乱!

有关键字using,可以将某些父类符号“提升”到子类中。但是,在这种情况下,不建议这样做!

Overloading method in base class, with member variable as default为例,说明需要使用using的地方。