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 数据报的传输过程中,出现各种的错误是在所难免的,为了通知源主 ...
随机推荐
- dubbo快速入门demo
参考文章 https://blog.csdn.net/abcwanglinyong/article/details/81906027 该demo包含三个项目,分别是: 服务提供端项目:provider ...
- Django前后端分离项目部署
vue+drf的前后端分离部署笔记 前端部署过程 端口划分: vue+nginx的端口 是81 vue向后台发请求,首先发给的是代理服务器,这里模拟是nginx的 9000 drf后台运行在 9005 ...
- 关于Vue v-model你需要知道的一切
v-model是Vue的一个指令,它提供了input和form数据之间或两个组件之间的双向数据绑定. 这在Vue开发中是一个简单的概念,但是v-model的真正威力需要一些时间才能理解. 到本教程结 ...
- 济南学习D3T1__线性筛和阶乘质因数分解
[问题描述] 从1− N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少. [输入格式] 第一行一个数字N. [输出格式] 一行,一个整数代表答案对100000007取模之后的 ...
- Phoenix踩坑填坑记录
Phoenix踩坑填坑记录 Phoenix建表语句 如何添加二级索引 判断某表是否存在 判断索引是否存在 Date类型日期,条件判断 杂项 记录Phoenix开发过程中的填坑记录. 部分原文地址:ph ...
- java 读取text内容
public static String readToString(String fileName) { String encoding = "UTF-8"; File file ...
- 1.Centos7修改主机名
1.在CentOS7中,有三种定义的主机名: 静态的(Static hostname):也称为内核主机名,是系统在启动时从/etc/hostname自动初始化的主机名. 瞬态的(Tansient ho ...
- HPE 交换机基础配置
1.交换机命名 (config)# hostname POE-SW 2.vlan创建及端口划分 1)端口加入vlan,两种方式 (config)# vlan 2 (vlan-2)# untagged ...
- Rsync同步工具
1.Rsync介绍 1.1 什么是Rsync? Rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接 ...
- 如何将下载到本地的JAR包手动添加到Maven仓库,妈妈再也不用担心我下载不下来依赖啦
我们有时候使用maven下载jar包的时候,可能maven配置都正确,但是部分jar包就是不能下载下来,如果maven设置都不正确的,可以查看我的maven系列文章,这里仅针对maven配置正确,但是 ...