先放结论
private:
1、仅可在 本类体中 被访问,类中的成员函数+友元函数
2、不能在外部、或被对象直接访问
2、不能被子类内成员函数访问、也不能被子类对象直接访问
protected:
1、在本类中,和private用法一样:可被类内成员函数调用、不能再外部直接调用
2、能被子类内成员函数访问
3、不能在外部 被子类直接访问(形式child.baseProtectedMember)
举例验证
特点1:
private、protected成员不能在外部直接访问
发现可选列表中只有public的b
特点2:
可在本类内 访问private、protected
特点3:
发现在子类内 的成员函数可以访问基类的proteced
(可选列表中出现了proteced的mv)
特点4:
发现子类内,不能访问基类的private成员(可选列表中 未出现m_base_private)
所以也就不能在外部 通过子类对象调用子类成员函数 来改变父类private的值
特点5:
发现在外部 子类对象不能直接访问基类的private、protected成员
(可选列表中 未出现protected的mv、private的m_Base_Private)
特点6:
在外部,子类对象可以通过调用子类的成员函数,来改变基类protected的变量。
其实是因为特点3子类成员函数可以访问基类proteced成员变量,所以才有了特点6能改变protected的值
完整代码
#include <iostream>
#include <string>
using namespace std;
class Parent
{
protected:
int mv;
private:
int m_base_private;
public:
Parent()
{
mv = 100;
m_base_private = 1022;
}
int value()
{
return mv;
}
int b;
};
class Child : public Parent
{
public:
int addValue(int v)
{
mv = mv + v;
return 0;
}
};
int main()
{
Parent p;
cout << "p.mv = " << p.value() << endl; //100
Child c;
cout << "c.mv = " << c.value() << endl; //100
c.addValue(1);
cout << "c.mv = " << c.value() << endl; //150
return 0;
}