C++ part7
1.C++ 继承和组合
类的组合和继承一样,是复用的重要方式。
要优先使用组合而不是继承。 原因:
- 组合是黑箱复用,对局部类的内部细节不可见;继承是白箱复用,父类的内部细节可见,破坏封装性。
- 继承在编译时刻就已经定义了,在运行时不能改变从父类继承的实现;而组合可以在运行时期通过对象的替换实现。
2.动态链接、静态链接
库文件里不是源代码,而是编译后的二进制代码。
动态链接库:需要有头文件,lib文件和dll文件。lib中有调用函数所在的文件模块(dll)和文件中函数位置信息,链接时把这两个信息放进目标程序。
静态链接库:lib中有函数的实现代码,链接时直接把代码加入可执行文件中。
动态链接:链接时,只把调用函数所在DLL和文件中函数位置信息放进可执行文件,程序运行的时候再从DLL中找到相应的函数代码,需要DLL文件的支持。
静态链接:链接时,把函数代码直接放进可执行文件,(当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝),运行时不需要其他库的支持。
3.子类重写后调用父类函数
#include<bits/stdc++.h>
class A{
public:
virtual void f(){ cout << "A"; }
};
class B : public A{
void f(){ cout << "B"; }
};
int main(){
A* a = new B();
a->A::f(); //输出A
return 0;
}
4.继承方式
public继承:
基类继承的成员在派生类中访问权限不变。
protected继承:
基类中继承的public访问权限变成protected,其他不变。
private继承:
基类继承的所有访问权限变private。
5.虚继承
概念:
虚继承用于解决多继承问题。
在多继承情况下,不同途径继承来的同一基类,会在子类存在多个拷贝(比如菱形继承问题)。这样会产生两个问题:浪费空间,存在二义性。
C++提供虚基类,使得继承间接共同使用同一基类时,只保留一份成员。
子类继承可以继承多个虚基类表指针。
原理:
每个虚继承的子类都有一个虚基类表指针,它指向一个虚基类表。虚基类表中记录了虚基类和本类的偏移地址,通过偏移地址就找到了虚基类的成员。
虚基类依旧占据继承类的存储空间。
比如:
class A{
public:
int a;
};
class B : virtual private A{
};
int main(){
B b;
cout << sizeof b; //输出8
return 0;
}
输出8,4字节虚基类表指针,4字节int。只是不会有多个虚基类的拷贝而已。
【注意】当虚基类是带参数的构造函数时,间接继承虚基类的派生类除了要初始化直接继承的父类,还要初始化虚基类。
class A{
public:
A(int a){}
};
class B : virtual public A{
public:
B(int b):A(b){}
};
class C : virtual public A{
public:
C(int c):A(c){}
};
class D : public B, public C{
public:
D(int d):A(d),B(d),C(d){}
// D(int d):B(d),C(d){} //error
};
C++ part7的更多相关文章
- 《数字图像处理原理与实践(MATLAB文本)》书代码Part7
这篇文章是<数字图像处理原理与实践(MATLAB文本)>一本书的代码系列Part7(由于调整先前宣布订单,请读者注意分页程序,而不仅仅是基于标题数的一系列文章),第一本书特色186经225 ...
- Python学习 Part7:类
Python学习 Part7:类 1. 作用域和命名空间 命名空间(namespace)就是一个从名称到对象的映射. 命名空间的一些实例:内置名称集(函数,像abs(),和内置异常名称),一个模块中的 ...
- MMORPG大型游戏设计与开发(客户端架构 part7 of vegine)
我在讲述某个东西的时候总喜欢从简单的入手,然后从互相关联的地方联合讲解,因为时间关系所以没能讲的十分详细,这点引以为憾,希望得到大家的谅解.这一节讲述的是微引擎(vengine)比较简单的一个模块,那 ...
- django入门-自定义管理界面-part7
尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6522854.html 完全翻译自官方文档 https://docs.djangoproje ...
- centOS学习part7:Oracle开机自启配置
0 上一章(http://www.cnblogs.com/souvenir/p/3884904.html)我们用了很多时间以及很长的篇幅来介绍oracle的整个安装过程,希望对大家用所帮助.oracl ...
- 本周总结(19年暑假)—— Part7
日期:2019.8.25 博客期:113 星期日
- part7 vuex实现数据共享
vuex 是数据框架(一个插件)(单项数据的改变流程,组件改数据必须先调Action用dispatch方法) 大型项目vue只能承担视图层的主要内容 大量数据传递的时候,往往需要一个数据框架辅助 例子 ...
- 面向对象 part7 class
类的定义 类实际上是个“特殊的函数“,就像能够定义函数表达式和函数声明一样,类语法 有两个组成部分:类表达式和类声明式 类声明 类声明没有提升 静态方法 只有构造函数名可以调用,实例无法使用.常用于应 ...
- CCNA - Part7:网络层 - ICMP 应该是你最熟悉的协议了
ICMP 协议 在之前网络层的介绍中,我们知道 IP 提供一种无连接的.尽力而为的服务.这就意味着无法进行流量控制与差错控制.因此在 IP 数据报的传输过程中,出现各种的错误是在所难免的,为了通知源主 ...
随机推荐
- mysqldumpslow基本使用
参数解释 -s, 是表示按照何种方式排序 c: 访问计数 l: 锁定时间 r: 返回记录 t: 查询时间 al:平均锁定时间 ar:平均返回记录数 at:平均查询时间 -t, 是top n的意思,即为 ...
- JVM有哪些垃圾回收器
JVM 的垃圾回收器 目录 JVM 的垃圾回收器 经典垃圾收集器 Serial 收集器 ParNew 收集器 Parallel Scavenge 收集器 Serial Old 收集器 Parallel ...
- 电脑微信电脑PC 多开/防撤回 补丁
简介 经常使用微信电脑版的用户都会发现一个蛋疼的事情,那就是微信PC版不支持多开,也就是不能同时登陆多个账号,这对于需要在电脑上登陆多个微信账号的朋友来说肯定是极其的不方便.另外有的时候别人撤回了一些 ...
- 【Soul网关探秘】http数据同步-Admin通知前处理
引言 本篇开始研究 Soul 网关 http 数据同步,将分为三篇进行分析: <Admin通知前处理> <变更通知机制> <Bootstrap处理变更通知> 希望三 ...
- SDS——动态字符串
Redis中简单动态字符串sds数据结构与API相关文件是:sds.h, sds.c. SDS本质上就是char *,因为有了表头sdshdr结构的存在,所以SDS比传统C字符串在某些方面更加优秀,并 ...
- 外观模式(Facade) Adapter及Proxy 设计模式之间的关系 flume 云服务商多个sdk的操作 face
小结: 1. 外观模式/门面模式 Facade 往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口/界面. Proxy(代理)注重在为Client-Subject提供一个访问的 ...
- P4826
总的来说, 这道题只考查了单纯的建图和最大生成树 但这却是蓝题(问号 题意 题意的理解比较麻烦 简单说就是 n 支队伍比赛,i 号队伍和 j 号队伍比赛可获得 i ^ j 的分数,然后其中一支队伍会输 ...
- 济南学习D1T1_haha
[问题描述] 栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序.例如,借助一个栈,依次将数组1,3,2按顺序入栈或出栈,可对其从大到小排序: 1入栈:3入栈:3出栈:2入栈:2出栈:1出栈. ...
- java中的IO处理和使用,API详细介绍(一)
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...
- 我用了半年的时间,把python学到了能出书的程度
Python难学吗?不难,我边做项目边学,过了半年就通过了出版社编辑的面试,接到了一本Python选题,并成功出版. 有同学会说,你有编程基础外带项目实践机会,所以学得快.这话不假,我之前的基础确实加 ...