1.C++ 继承和组合

类的组合和继承一样,是复用的重要方式。

要优先使用组合而不是继承。 原因:

  1. 组合是黑箱复用,对局部类的内部细节不可见;继承是白箱复用,父类的内部细节可见,破坏封装性。
  2. 继承在编译时刻就已经定义了,在运行时不能改变从父类继承的实现;而组合可以在运行时期通过对象的替换实现。

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的更多相关文章

  1. 《数字图像处理原理与实践(MATLAB文本)》书代码Part7

    这篇文章是<数字图像处理原理与实践(MATLAB文本)>一本书的代码系列Part7(由于调整先前宣布订单,请读者注意分页程序,而不仅仅是基于标题数的一系列文章),第一本书特色186经225 ...

  2. Python学习 Part7:类

    Python学习 Part7:类 1. 作用域和命名空间 命名空间(namespace)就是一个从名称到对象的映射. 命名空间的一些实例:内置名称集(函数,像abs(),和内置异常名称),一个模块中的 ...

  3. MMORPG大型游戏设计与开发(客户端架构 part7 of vegine)

    我在讲述某个东西的时候总喜欢从简单的入手,然后从互相关联的地方联合讲解,因为时间关系所以没能讲的十分详细,这点引以为憾,希望得到大家的谅解.这一节讲述的是微引擎(vengine)比较简单的一个模块,那 ...

  4. django入门-自定义管理界面-part7

    尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6522854.html 完全翻译自官方文档 https://docs.djangoproje ...

  5. centOS学习part7:Oracle开机自启配置

    0 上一章(http://www.cnblogs.com/souvenir/p/3884904.html)我们用了很多时间以及很长的篇幅来介绍oracle的整个安装过程,希望对大家用所帮助.oracl ...

  6. 本周总结(19年暑假)—— Part7

    日期:2019.8.25 博客期:113 星期日

  7. part7 vuex实现数据共享

    vuex 是数据框架(一个插件)(单项数据的改变流程,组件改数据必须先调Action用dispatch方法) 大型项目vue只能承担视图层的主要内容 大量数据传递的时候,往往需要一个数据框架辅助 例子 ...

  8. 面向对象 part7 class

    类的定义 类实际上是个“特殊的函数“,就像能够定义函数表达式和函数声明一样,类语法 有两个组成部分:类表达式和类声明式 类声明 类声明没有提升 静态方法 只有构造函数名可以调用,实例无法使用.常用于应 ...

  9. CCNA - Part7:网络层 - ICMP 应该是你最熟悉的协议了

    ICMP 协议 在之前网络层的介绍中,我们知道 IP 提供一种无连接的.尽力而为的服务.这就意味着无法进行流量控制与差错控制.因此在 IP 数据报的传输过程中,出现各种的错误是在所难免的,为了通知源主 ...

随机推荐

  1. 02--Docker配置阿里云镜像加速器

    1.登录阿里云控制台,在产品与服务中收索 "容器镜像服务" 2.点击镜像加速器,CentOS 3.在路径 /etc/docker/daemon.json 下配置加速器地址 4.重新 ...

  2. Docker镜像仓库Harbor安装

    export VERSION=18.06 && curl -fsSL http://rainbond-pkg.oss-cn-shanghai.aliyuncs.com/releases ...

  3. ELK (elasticsearch+kibana+logstash+elasticsearch-head) 华为云下载地址

    https://mirrors.huaweicloud.com/elasticsearch https://mirrors.huaweicloud.com/kibana https://mirrors ...

  4. C++旋转数组(三种解法详解)

    题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 附加要求 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题. 你可以使用空间复杂度为 O(1) 的 原地 ...

  5. Update Node Using a Package Manager nodesource

    How to Update Node.js to Latest Version (Linux, Ubuntu, OSX, Others) - HostingAdvice.com https://www ...

  6. https://twistedmatrix.com/documents/current/core/howto/defer.html

    https://twistedmatrix.com/documents/current/core/howto/defer.html

  7. dij的优先队列边表优化

    dij的复杂度为v*v,通过优先队列优化后为e*logv. (第一次写,没有过多的测试,不保证对.只当是测试blog了!) #include<cstdio> #include<ios ...

  8. RocketMQ 常用消息类型

    文章首发于公众号<程序员果果> 地址 : https://mp.weixin.qq.com/s/dYqGd9zi2mNelsNNLIribg 消息发送示例 导入依赖: <depend ...

  9. 在 ASP.NET Core 应用中使用 Cookie 进行身份认证

    Overview 身份认证是网站最基本的功能,最近因为业务部门的一个需求,需要对一个已经存在很久的小工具网站进行改造,因为在逐步的将一些离散的系统迁移至 .NET Core,所以趁这个机会将这个老的 ...

  10. SpringBoot-Maven打包压缩瘦身

    SpringBoot-Maven打包压缩瘦身 一.Spring Boot 可执行 jar 分析 1.1 打包 1.2 两种 jar 的比较 1.3 一次打包两个 jar 二.SpringBoot迭代发 ...