Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
joebiden
interview
提交
87c3df1f
I
interview
项目概览
joebiden
/
interview
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
interview
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
87c3df1f
编写于
3月 27, 2018
作者:
辉哈
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
虚继承、虚函数
上级
9be9cf70
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
23 addition
and
1 deletion
+23
-1
README.md
README.md
+23
-1
未找到文件。
README.md
浏览文件 @
87c3df1f
...
...
@@ -517,7 +517,29 @@ virtual int A() = 0;
Data
vall
=
{
0
,
"Anna"
};
```
### 虚继承、虚函数继承
### 虚继承、虚函数
#### 虚继承
虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间、存在二义性)。
底层实现原理与编译器相关,一般通过
**虚基类指针**
和
**虚基类表**
实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。
实际上,vbptr指的是虚基类表指针(virtual base table pointer),该指针指向了一个虚基类表(virtual table),虚表中记录了虚基类与本类的偏移地址;通过偏移地址,这样就找到了虚基类成员,而虚继承也不用像普通多继承那样维持着公共基类(虚基类)的两份同样的拷贝,节省了存储空间。
#### 虚继承与虚函数
*
相同之处:都利用了虚指针(均占用类的存储空间)和虚表(均不占用类的存储空间)
*
不同之处:
*
虚继承
*
虚基类依旧存在继承类中,只占用存储空间
*
虚基类表存储的是虚基类相对直接继承类的偏移
*
虚函数
*
虚函数不占用存储空间
*
虚函数表存储的是虚函数地址
### 内存分配和管理
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录