派生类不能访问基类对象的protected成员


派生类对象可以访问其自身的基类子对象的protected数据成员,但是不能访问另一个独立的基类对象的protected成员,请看下面代码:

   
  #include <iostream>
  

using namespace std;

class A{
public:
A(int a,int b):
protectedVal(a),privatedVal(b)
{
}

bool compareProtected(const A &rhs);//访问和自己类型相同的另外的单独对象

bool comparePrivated(const A &rhs);

protected:
int protectedVal;

private:
int privatedVal;
};

bool A::compareProtected(const A &rhs)
{
return this->protectedVal == rhs.protectedVal;
}

bool A::comparePrivated(const A &rhs)
{
return this->privatedVal == rhs.privatedVal;
}

class B:public A{
public:
B(int a,int b,int c):
A(a,b),protectedValB(c)
{}

int addProtected(const A &rhs);//派生类访问另一个独立基类子对象的protected成员

protected:
int protectedValB;
};

int B::addProtected(const A &rhs)
{
return protectedValB + rhs.protectedVal;
}

int main()
{
A aObj1(1,2);
A aObj2(3,4);
bool result1 = aObj1.compareProtected(aObj2);
bool result2 = aObj1.comparePrivated(aObj2);
cout << result1 << endl;
cout << result2 << endl;
}

运行结果如下(环境VS2008):

   
  1>------ 已启动生成: 项目: test36, 配置: Debug Win32 ------
  
1>正在编译...
1>main.cpp
1>g:\workspace\exercise\cppprimer\test36\test36\main.cpp(47) : error C2248: “A::protectedVal”: 无法访问 protected 成员(在“A”类中声明)
1> g:\workspace\exercise\cppprimer\test36\test36\main.cpp(17) : 参见“A::protectedVal”的声明
1> g:\workspace\exercise\cppprimer\test36\test36\main.cpp(5) : 参见“A”的声明
1>生成日志保存在“file://g:\Workspace\Exercise\CPPPrimer\test36\test36\Debug\BuildLog.htm”
1>test36 - 1 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

这段代码的运行结果确实验证了上面的观点:子类中不能访问基类的另外一个独立的对象。这样设计的原因是什么呢?
但是,我在类A中为什么可以方位类A的另外的单独的对象中的protected以及private成员呢?这又是为什么?

面向对象 C++

沢宫爱丽奈 11 years, 12 months ago

1、

   
  bool A::comparePrivated(const A &rhs)
  
{
return this->privatedVal == rhs.privatedVal;
}

这段可以成功访问,是因为类的private成员可以被该类的成员访问,这个权限定义主要是针对不同的类来实现的,对于同一个类的不同对象则没有这样的定义。comparePrivated(const A &rhs)是A的成员函数,a是A的私有成员,但传入给A的rhs对象的私有成员却是可以直接在comparePrivated函数当中使用的。如果参数是同类对象的引用、指针,情况也完全相同。这个可能为了方便类似拷贝构造函数而实现的一个小“缺口”。简而言之,类成员的权限是在类与类之间建立的关系,而不是对象与对象之间。
2、

   
  int B::addProtected(const A &rhs)
  
{
return protectedValB + rhs.protectedVal;
}

这里B类不能直接访问A类的protected成员,是因为B类是A类的派生类,派生类只能访问自己从基类继承的protected成员,而不能访问其他类的protected成员,因此,这里会报错。

朝天椒甜不辣 answered 11 years, 12 months ago

Your Answer