C++-派生类不能访问基类对象的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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 Class B 肯定可以访问本类中的所有成员,包括 private 成员,即使不是同一个对象中,例如
void B::addProtected(const B &rhs)
{
this->protectedVal = rhs.protectedVal; // protect 成员
this->privateVal = rhs.privateVal; // private 成员
}
但是,A类虽然是B类的基类,但它们毕竟不是同一个类,不同的类怎么可以直接访问它的protect成员或private成员呢?肯定不可以。
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成员,因此,这里会报错。
访问控制是的控制范围是类内的。在B继承自A,也就继承了A的公有成员和保护成员。保护成员能在B类内使用。
所以B是可以访问他所继承过来的成员的。
类似的:
class B : public A {
protected:
int protectedValB;
int protectedVal; //这个是继承自A的,可以访问。
}
但是由参数传进来的A,是不在B内的,也不在B::限定符下的作用域内。所以不能访问。
至于
bool A::compareProtected(const A &rhs)
{
return this->protectedVal == rhs.protectedVal;
}
可以使用传进来的A的私有变量,是因为在A::的限定符下,在这个域内是可以访问到A的私有变量的。
个人看法是:访问控制的实现类似于namespace命名空间的实现。我是这样理解的在A::的命名空间下可以访问A的所有成员。在B::的命名空间下可以访问B的所有成员。B继承了类A的成员,看起来就像在B中也定义了A的公有成员和保护成员一样,所以在B::的命名空间下可以访问。至于传进来的A对象不再B::的命名空间下,就不能访问到它的非公有成员。
欢迎讨论指正。