C++中类中为继承而生的访问级别: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++面向对象中的访问级别除了publicprivate外,还有protect
    -protect修饰的成员不能被外界所访问
    -protect修饰的成员能被子类直接访问
    -protect关键字是为了继承而专门设计的
    -没有protect就无法完成真正意义上的代码复用

猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/81543555
今日推荐