C++中类的继承方式-public,protected,private
2016-05-31 21:27
405 查看
C++中,有三种继承方式public,protected,private 同样,类中也有三种访问权限,public,protected,private
一,公有继承
下面用一个简单的例子测试一下,三种有什么不同
#include <iostream> using namespace std; //定义一个父类Parent class Parent { //定义三个变量a,b,c private: int a; protected: int b; public: int c; //定义三个函数,设置a,b,c的值 void set_a(int n){a=n;} void set_b(int n){b=n;} void set_c(int n){c=n;} //定义一个函数,获得变量a,b,c的值 int get_a(){return a;} int get_b(){return b;} int get_c(){return c;} //定义一个构造函数 Parent(int a=0,int b=1,int c=2):a(a),b(b),c(c){} }; class Son:public Parent { }; int main() { //声明并初始化a,b,c Parent P(67,89,97); //a=67,b=89,c=97 /* 分别用P直接访问abc P.a;-------#include <iostream> using namespace std; //定义一个父类Parent class Parent { //定义三个变量a,b,c private: int a; protected: int b; public: int c; //定义三个函数,设置a,b,c的值 void set_a(int n){a=n;} void set_b(int n){b=n;} void set_c(int n){c=n;} //定义一个函数,获得变量a,b,c的值 int get_a(){return a;} int get_b(){return b;} int get_c(){return c;} //定义一个构造函数 Parent(int a=0,int b=1,int c=2):a(a),b(b),c(c){} }; class Son:public Parent { }; int main() { //声明并初始化a,b,c Parent P(67,89,97); //a=67,b=89,c=97 /* 分别用P直接访问abc P.a;||=== 报错:D:\visual studio 2015\Projects\test\main.cpp|8|error: 'int Parent::a' is private P.b;//报错:error:'int parent::b 'is protected P.c;ok 说明对于同一个类中,protected和private没什么不同 */ Son son;//声明子类son son.set_b(90); son.get_b(); son.set_a(98); son.get_a(); cout<<son.get_a(); //代码无异常,说明,父类的一切都被子类完整的继承了 return 0; } 二,保护继承 我们更改一下继承方式 class Son:protected class Parent 代码不变,结果: ||=== 生成: Debug in test (compiler: GNU GCC Compiler) ===| D:\visual studio 2015\Projects\test\main.cpp||In function 'int main()':| D:\visual studio 2015\Projects\test\main.cpp|16|error: 'void Parent::set_b(int)' is inaccessible| D:\visual studio 2015\Projects\test\main.cpp|41|error: within this context| D:\visual studio 2015\Projects\test\main.cpp|41|error: 'Parent' is not an accessible base of 'Son'| D:\visual studio 2015\Projects\test\main.cpp|21|error: 'int Parent::get_b()' is inaccessible| D:\visual studio 2015\Projects\test\main.cpp|42|error: within this context| D:\visual studio 2015\Projects\test\main.cpp|42|error: 'Parent' is not an accessible base of 'Son'| D:\visual studio 2015\Projects\test\main.cpp|15|error: 'void Parent::set_a(int)' is inaccessible| D:\visual studio 2015\Projects\test\main.cpp|43|error: within this context| D:\visual studio 2015\Projects\test\main.cpp|43|error: 'Parent' is not an accessible base of 'Son'| D:\visual studio 2015\Projects\test\main.cpp|20|error: 'int Parent::get_a()' is inaccessible| D:\visual studio 2015\Projects\test\main.cpp|44|error: within this context| D:\visual studio 2015\Projects\test\main.cpp|44|error: 'Parent' is not an accessible base of 'Son'| ||=== Build 失败了: 12 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 父类原有的public 函数被子类protected继承后,变得不可访问了 ![这里写图片描述](https://img-blog.csdn.net/20160531211315757) 由图片知道,protected继承,会降低访问权限
修改一下代码:
class Son:protected Parent { public: void set_value(int n) { set_a(n); set_b(n); set_c(n); } }; int main() { Son son; son.set_value(90); return 0; }
“`
这样修改就OK了,说明了两点,一是,protected继承,会降低访问权限
二是,protected 和private 一样,不能直接访问,要通过函数才能调用
private 继承同理
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性