本文参照于狄泰软件学院,唐佐林老师的——《C++深度剖析教程》
问题:子类是否可以直接访问父类的私有成员?
1. 根据面向对象理论:子类拥有父类的一切属性和行为,所以子类能够直接访问父类的私有成员的!
2. 根据C++的语法:外界不能直接访问private成员,所以子类不能直接访问父类的私有成员。到底哪个结论才是正确的呢?我们可以写代码来验证一下想法。测试发现:子类不能直接访问父类的私有成员!
既然子类不能直接访问父类的私有成员,那么除了通过成员函数外,有没有别的方法可以访问到父类的私有成员呢?
新的访问级别:protected
为了解决子类访问父类私有成员的问题:C++中为我们提供了一种新的访问级别——protected。
1. 修饰的成员不能被外界直接访问
2. 修饰的成员可以被子类直接访问
示例代码:protected初体验
#include <iostream>
#include <string>
using namespace std;
class Parent
{
protected:
int mv;
public:
Parent()
{
mv = 100;
}
int value()
{
return mv;
}
};
class Child : public Parent
{
public:
int addValue(int v)
{
mv = mv + v;
}
};
int main()
{
Parent p;
cout << "p.mv = " << p.value() << endl;
// p.mv = 1000; // error
Child c;
cout << "c.mv = " << c.value() << endl;
c.addValue(50);
cout << "c.mv = " << c.value() << endl;
// c.mv = 10000; // error
return 0;
}
问题:为什么面向对象中需要protected?
面向对象源于生活,那么我们也可以在生活中找到例子。
private:属于自己的秘密
public:一些公开的信息,姓名,学历等
那么,我们有一些秘密是可以分享给亲近的人,这种秘密就是protected了。
实际上:protected关键字就是为了继承而专门设计的,没有protected就无法完成真正的代码复用。