继承《一》
来源:互联网 发布:qq假红包软件 编辑:程序博客网 时间:2024/05/26 09:57
继承的概念:
继承是面向对象程序设计使代码可以复用的最重要的手段,它容许程序员在保持原有类型特性的基础上进行扩展,增加功能。这样产生的类叫新生的类,叫派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知程度。
继承的定义格式:
他们在内存中的布局如图所示:说明他们有两个作用域
而继承方式有三种,分别是:public(公有继承),protected(保护继承),private(私有继承)。
切记:
1,基类的私有成员在派生类中是不能被访问的,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,那么继承方式就定义为公有继承(protected)
2,public继承是一个接口继承,保持is-a原则。
3,不管是哪种继承方式,在派生类中都可以访问基类的公有成员和保护成员,基类的私有成员存在但在子类中不能访问。
4,使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public。
我们假设有两种情况,a,在D类中包含了B类。b,在D类中私有继承了B类。那么现在如果在B类中有一个保护的成员-b,那么在情况a中是不可以访问的,但是在情况b中是可以访问的。
派生类中的构造函数和析构函数:
如下面的简单程序:
#include<iostream>using namespace std;class B{public:B(){cout << "B()" << endl;}~B(){cout << "~B()" << endl;}};class D :public B{public:D(){cout << "D()" << endl;}~D(){cout << "~D()" << endl;}};void Funtest(){D d;}int main(){Funtest();return 0;}输出的结果如图所示:
这说明函数的执行次序和函数的调用次数是不一样的,函数的执行次序是:基类构造函数->派生类中对象构造函数->派生类构造函数体。而函数的调用次序是:当程序走到D()时,走到初始化列表时程序来到B(),当B()结构体运行完了以后再来到D()的结构体,也就是说先构造属于B()的构造函数,再构造D()自己的结构函数,然后再析构~D,~B。换句话说,D()有一个隐藏的缺省参数:B()
友元与继承:
友元关系是不能继承的,即基类友元不能访问子类私有和保护成员。
继承与转换:
派生类的值可以附给基类,基类的指针可以指向派生类,反之不行
多继承:
如下程序:
#include<iostream>using namespace std;class B1{public:int _b1;};class B2{public: int _b2;};class C :public B1, public B2{public:int _d;};int main(){int a, b;return 0;}
有两个派生类,它们在内存中的布局:
而如果把继承的两个类反过来,那么它们在内存中的布局也会反过来。
- 继承《一》
- 继承一之继承方式
- 继承(一)
- 多继承一题
- c# 继承(一)
- Hibernate 继承映射(一)
- JS继承一
- JavaScript继承详解(一)
- c++ 29 继承一
- JavaScript继承详解 (一)
- 继承(一)
- 29 继承(一)
- 继承与派生 一
- javascript继承(一)
- 类继承学习一
- 继承(一)
- 继承(一)
- C++继承(一)
- maven的初识别以及用来管理一个小案例的实现具体实现步骤
- css修改单选框与复选框样式
- UBUNTU 彻底删除 MYSQL 然后重装 MYSQL
- 解决多进程中APScheduler重复运行的问题
- HTML ASCII 参考手册
- 继承《一》
- 设计模式——建造者
- ACM递推递归练习I 蟠桃记
- 动态规划问题
- MySQL查询相关
- 设计模式-2-LSP里氏替换原则
- git 常用命令
- 原来Github上的README.md文件这么有意思——Markdown语言详解
- 关于ERP