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

发布于 2016-11-15 11:06:15 字数 1340 浏览 1810 评论 3

派生类对象可以访问其自身的基类子对象的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清晨说ぺ晚安 2017-08-03 07:08:19

在 Class B 肯定可以访问本类中的所有成员,包括 private 成员,即使不是同一个对象中,例如

 void B::addProtected(const B &rhs)
{
this->protectedVal = rhs.protectedVal; // protect 成员
this->privateVal = rhs.privateVal; // private 成员
}

但是,A类虽然是B类的基类,但它们毕竟不是同一个类,不同的类怎么可以直接访问它的protect成员或private成员呢?肯定不可以。

夜无邪 2017-05-01 05:22:27

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成员,因此,这里会报错。

泛泛之交 2016-12-20 16:22:02

访问控制是的控制范围是类内的。在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::的命名空间下,就不能访问到它的非公有成员。
欢迎讨论指正。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文