请考虑以下示例代码:
#include <iostream>
using namespace std;
class A
{
private:
static int a;
int b;
protected:
public:
A() : b(0) {}
void modify()
{
a++;
b++;
}
void display()
{
cout << a <<"\n";
cout << b <<"\n";
}
};
int A::a=0;
class B : public A {
private:
int b;
public:
B(): b(5)
{
}
};
int main()
{
A ob1;
B ob2;
ob1.display();
ob2.display();
return 0;
}
在上面的代码中,class A
有一个私有数据成员b
,而class B
也有一个私有数据成员b
。函数display()
用于显示数据成员。
当我使用ob1.display()
调用display()时,display()访问A类的私有数据成员b
。我理解这一点。但是当我使用ob2.display
调用显示时,b
显示()访问?它是A类的b
还是B类的b
?请解释它访问class A's b
或class B's b
答案 0 :(得分:3)
它将访问A::b
。类display
中的A
方法实现根本不知道B::b
的存在,更不用说使用它了。出于所有意图和目的,B::b
与A::b
分开。仅在B
本身的范围内,名称冲突使b
引用B::b
,隐藏A::b
。成员变量不能是virtual
。
答案 1 :(得分:2)
ob2.display()
将访问派生类成员
成员函数调用始终在this
,this->display()
this
上进行评估,以防指向Base类的对象,因此b
内的display()
引用} function被评估为this->b
,它是Base类的b
。
这是因为Base类的display()
不知道是否有任何其他类派生自它。基类始终独立于Derived类。为解决问题,遵循的uual模式是在Derived类中提供display()
方法,然后再调用Base类的dsiplay()
方法。
void B::display()
{
//cout << a <<"\n";
cout << b <<"\n";
A::display();
}
答案 2 :(得分:0)
是班级A
。 A::display()
无法访问B私人会员。