C++关键字protected的作用详解_c++ protected_马小超i的博客-CSDN博客
======================
"为继承而生"
//对应于 3种不同的应用场景 ****************
public: 完全公开,任何模块都可以使用。
private: 完全私有,只有自己才能使用。
protect: 只想公开给同伙使用,禁止同伙之外的人(模块 /函数等等)使用。这就是“继承”?
友元函数:类似 protect,但更简单。友元只公开需要使用类中的有用部分(被使用者<源类> 自主控制公开的内容)。而继承则会继承到一堆有用的,以及没用的垃圾,如果编译器的优化能录不足,则会造成程序变得比 友元还要臃肿 ?(使用者<外部类> 自己决定需要使用的 源类的内容)。
同时,它们封装的程度也是不同的。
在从少成员继承,到最少成员继承的某个变化范围内,可能与友元的臃肿程度类似。
到目前为止,我们知道,C++类中成员的访问级别有public与private,public公有级别能被外界直接访问,private只能被在类内部和类成员函数访问,不能被外界直接访问。但是我们又知道,子类继承父类后,便拥有了父类的所有属性,那么这个时候,子类能直接访问父类的私有成员吗?
- 从面向对象的理论:子类拥有父类的所有属性,能直接访问父类的私有成员
- 从C++语法分析:private属性的成员不能直接被外界访问
二者看似矛盾,下边我们就以代码来验证:
#include <iostream>
#include <string>
using namespace std;
class Parent
{
private:
int m_value1;
void fun1()
{
cout << "Parent::fun1()" << endl;
}
public:
int m_value2;
void fun2()
{
cout << "Parent::fun2()" << endl;
}
};
class Child : public Parent
{
public:
void ChildFun()
{
m_value1 = 10; //子类中直接访问父类的私有成员变量
fun1(); //子类中直接访问父类的私有成员函数
m_value2 = 20; //子类中直接访问父类的公有成员变量
fun2(); //子类中直接访问父类的公有成员变量
}
};
int main()
{
Child C;
C.ChildFun();
system("pause");
}
编译一下:
从编译结果看,子类是无法直接访问父类的私有成员的
在C++类中,成员除了有public与private属性外,还有protect(保护)属性,用protect修饰的成员,跟私有成员一样,无法被外界直接访问,但是能被子类直接访问。也可以说,protect就是专门为继承而生的。下边我们把上述代码中的private属性改为protect属性
#include <iostream>
#include <string>
using namespace std;
class Parent
{
protected: //将原来的private属性改为protect属性
int m_value1;
void fun1()
{
cout << "Parent::fun1()" << endl;
}
public:
int m_value2;
void fun2()
{
cout << "Parent::fun2()" << endl;
}
};
class Child : public Parent
{
public:
void ChildFun()
{
m_value1 = 10; //子类中直接访问父类的保护成员变量
fun1(); //子类中直接访问父类的保护成员函数
m_value2 = 20; //子类中直接访问父类的公有成员变量
fun2(); //子类中直接访问父类的公有成员变量
}
};
int main()
{
Child C;
C.ChildFun();
system("pause");
}
编译输出:
从输出结果可以看到,在子类中,是直接能访问父类的protect属性成员变量与成员函数的。
总结:
-C++面向对象中的访问级别除了public、private外,还有protect
-protect修饰的成员不能被外界所访问
-protect修饰的成员能被子类直接访问
-protect关键字是为了继承而专门设计的
-没有protect就无法完成真正意义上的代码复用
————————————————
版权声明:本文为CSDN博主「火焰山大白菜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lms1008611/article/details/81543555