前言
在C++中,public
、private
和protected
是三个重要的访问修饰符,它们用于控制类成员的访问权限。
下面简单记录一下相关知识,记录于此,方便自己查阅。
正文
为了验证权限,下面写demo进行测试。
访问范围
private
私有属性,即类成员对外不可见,对内可见。此为默认属性,未指定访问属性的成员会被默认为是private属性。
protected
public
公有属性,即类成员对外可见,对内也可见。
测试
测试1
分别定义不同访问权限的int类型变量
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; } };
类中可以访问private,protected和public的属性。当然方法也是可以的,上面没有体现。
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(); //可以调用 }
类对象除了public的变量可以访问,其他private和protected变量都不可以访问。
测试2
子类以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(); //不可调用 }
子类对象无法访问父类的任意成员。
测试3
以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修饰的就可以访问了,其他的都不允许。
测试4
除了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,public或protected修饰继承方式,父类中仅仅使用private修饰的成员不可以访问,其他的可以。
使用private,protected,或者默认方式的继承方式,子类的对象都不可以访问父类中的所有成员。
使用public修饰继承方式,子类对象仅可以访问父类中public修饰的成员。
参考文章
《