到目前为止,我们知道,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就无法完成真正意义上的代码复用