前言
在C++中,public
、private
和protected
是三个重要的访问修饰符,它们用于控制类成员的访问权限。
下面简单记录一下相关知识,记录于此,方便自己查阅。
正文
为了验证权限,下面写demo进行测试。
修饰属性和函数
private
私有属性,即类成员对外不可见,对内可见。此为默认属性,未指定访问属性的成员会被默认为是private属性。
protected
保护属性,即成员对外不可见,对内可见,对派生类可见。
public
公有属性,即类成员对外可见,对内也可见。
demo
下面通过一个demo看一下权限访问范围。
class BiuParent{ private: int biu_field_private; void biu_fun_private() { std::cout << "biu_fun_private" << biu_field_private << std::endl; std::cout << "biu_fun_private" << biu_field_protected << std::endl; std::cout << "biu_fun_private" << biu_field_public << std::endl; } protected: int biu_field_protected; void biu_fun_protected() { std::cout << "biu_fun_protected" << biu_field_private << std::endl; std::cout << "biu_fun_protected" << biu_field_protected << std::endl; std::cout << "biu_fun_protected" << biu_field_public << std::endl; } public: int biu_field_public; void biu_fun_public() { std::cout << "biu_fun_public" << biu_field_private << std::endl; std::cout << "biu_fun_public" << biu_field_protected << std::endl; std::cout << "biu_fun_public" << biu_field_public << std::endl; } BiuParent() { biu_field_private = 1; biu_field_protected = 2; biu_field_public = 3; std::cout << "BiuParent()---> biumall.com" << std::endl; } };
初始化类对象,看一下
int main() { BiuParent biuParent; //std::cout << biuParent.biu_field_private << std::endl; // 不可访问 //std::cout << biuParent.biu_field_protected << std::endl; // 不可访问 std::cout << biuParent.biu_field_public << std::endl; //可以访问 //biuParent.biu_fun_private(); //不可调用 //biuParent.biu_fun_protected(); //不可调用 biuParent.biu_fun_public(); //可以调用 }
小结
类中可以访问private,protected和public的成员变量和成员函数。
类的对象除了public的变量可以访问,其他private和protected变量都不可以访问。
修饰继承方式
public,private,protected不仅可以修饰成员变量和成员函数,还可以修饰继承方式。
下面测试不同的继承方式,看看访问类成员的权限有哪些变化。
测试1
子类以private方式继承
class BiuSon : private BiuParent { public: BiuSon() { std::cout << "BiuSon()---> biumall.com"<< std::endl; //biu_field_private = 4; //不可以访问 biu_field_protected = 5; biu_field_public = 6; //biu_fun_private(); //不可以访问 biu_fun_protected(); biu_fun_public(); } };
或者以protected方式继承(因为效果一样,所以都放一起)
class BiuSon : protected BiuParent { public: BiuSon() { std::cout << "BiuSon()---> biumall.com"<< std::endl; //biu_field_private = 4; //不可以访问 biu_field_protected = 5; biu_field_public = 6; //biu_fun_private(); //不可以访问 biu_fun_protected(); biu_fun_public(); } };
可以看出,使用private或protected修饰继承方式,父类中private修饰的成员不可以访问,其他的均可以访问。
继续看子类对象访问情况:
int main() { BiuSon biuSon; //std::cout << biuSon.biu_field_private << std::endl; // 不可访问 //std::cout << biuSon.biu_field_protected << std::endl; // 不可访问 //std::cout << biuSon.biu_field_public << std::endl; //不可访问 //biuSon.biu_fun_private(); //不可调用 //biuSon.biu_fun_protected(); //不可调用 //biuSon.biu_fun_public(); //不可调用 }
子类对象无法访问父类的任意成员。
小结
使用private或protected继承父类的子类,除了private修饰的,其他的都可以访问
使用private或protected继承父类的子类的对象,父类中任意的成员或函数都不可以访问。(不管啥修饰权限,都不允许)
测试2
以public方式继承
class BiuSon : public BiuParent { public: BiuSon() { std::cout << "BiuSon()---> biumall.com"<< std::endl; //biu_field_private = 4; //不可以访问 biu_field_protected = 5; biu_field_public = 6; //biu_fun_private(); //不可以访问 biu_fun_protected(); biu_fun_public(); } };
上面以public,访问,对于父类private修饰的属性和方法依旧不可以访问。
继续看子类对象访问情况:
int main() { BiuSon biuSon; //std::cout << biuSon.biu_field_private << std::endl; // 不可访问 //std::cout << biuSon.biu_field_protected << std::endl; // 不可访问 std::cout << biuSon.biu_field_public << std::endl; //可访问 //biuSon.biu_fun_private(); //不可调用 //biu_fun_protected(); //不可调用 biuSon.biu_fun_public(); //可调用 }
但对于子类对象来说,除了父类中public修饰的就可以访问了,其他的都不允许。
小结
使用private或protected继承父类的子类,除了private修饰的,其他的都可以访问。
使用public继承父类的子类的对象,仅可以访问public修饰的父类成员。
测试3
除了public方式继承,还有一种是默认方式继承,也就是不写修饰符。
class BiuSon : BiuParent { public: BiuSon() { std::cout << "BiuSon()---> biumall.com" << std::endl; //biu_field_private = 4; //不可以访问 biu_field_protected = 5; biu_field_public = 6; //biu_fun_private(); //不可以访问 biu_fun_protected(); biu_fun_public(); } };
子类中出来private修饰的无法访问,其他的都可以。
继续看子类对象访问情况:
int main() { BiuSon biuSon; //std::cout << biuSon.biu_field_private << std::endl; // 不可访问 //std::cout << biuSon.biu_field_protected << std::endl; // 不可访问 //std::cout << biuSon.biu_field_public << std::endl; // 不可访问 //biuSon.biu_fun_private(); //不可调用 //biu_fun_protected(); //不可调用 //biuSon.biu_fun_public(); //不可调用 }
子类对象无法访问父类的任意成员。
小结
使用private或protected继承父类的子类,除了private修饰的,其他的都可以访问。
使用默认方式继承父类的子类的对象,父类中任意的成员或函数都不可以访问。(不管啥修饰权限,都不允许)
参考文章
《