c++基础语法:虚继承
发布时间:2024-01-23 10:01:00
虚继承 的概念的提出主要是为了解决C++多继承的问题,举个最简单的例子:
class animal{
public :
void op()
{cout << "hello animal" ;}
};
class tiger : public animal {
public :
void tg()
{cout << "this is tiger" ;}
};
class lion : public animal {
public :
void lo()
{cout << "this is lion" ;}
};
class liger : public tiger, public lion {
public :
void lo()
{cout << "this is lion" ;}
};
int main()
{
class liger oneliger ;
liger.op() ;
}
上面的 liger.op() ;会报错,会提示模糊的成员变量,因为tiger和lion中都包含父类animal的op()操作。
此时内存中的oneliger对象布局从低到高是下面这样的:
1、animal的成员变量
2、继承tiger的成员变量
//包括 op()
3、继承lion的成员变量
/ /也包括op()
4、liger本身的成员变量
PS: 对象在内存中的布局首先是如果有虚函数的话就是虚表,虚表就是指向一个函数指针数组的指针,然后就是成员变量,如果是普通继承则首先是最根父类的成员变量,然后是次父类成员变量,依次而来最后是本身的成员变量[虚继承相反],成员函数被编译成全局函数不存储在对象空间内,需要调用成员函数的时候,通过类名找到相应的函数,然后将对象的this指针传给函数:
比如这样的代码
CTest test;
test.print();
编译器在内部将转换为:(伪代码)
CTest test;
CTest_print( &test ); // CTest的print函数转换为:CTest_print( CTest* const this);
所以这就和普通函数调用差别不大了
实际应该是函数找到对象,即根据this指针
为了解决 上面多继承的问题,所以c++中提出了虚继承的概念,虚继承就是在子类中只保留一份父类的拷贝,拿上面的类子来说,就是“如果有一份父类的拷贝的话就用父类的拷贝,如果没有就加入一份拷贝” :
class animal{
public :
void op()
{cout << "hello animal" ;}
};
class tiger : public virtual animal {
public :
void tg()
{cout << "this is tiger" ;}
};
class lion : public virtual animal {
public :
void lo()
{cout << "this is lion" ;}
};
class liger : public tiger, public lion {
public :
void lo()
{cout << "this is lion" ;}
};
int main()
{
class liger oneliger ;
liger.op() ;
}
此时liger对象在内存中的布局就变成了:
4、animal的成员变量
3、继承tiger的成员变量
//包括 op()
2、继承lion的成员变量
//已经包含一份拷贝,所以 已经不包括op()
1、liger本身的成员变量
这样内存中就只有一份animal对象的拷贝,所以就不会存在模糊的问题;


猜你喜欢
- Matplotlib是一个很好的作图软件,但是python下默认不支持中文,所以需要做一些修改,方法如下:1.在python安装目录的Lib
- 已经记不得是在哪个网站上看到的了,一般情况下对于验证码的校验,大家很容易写成下面这样: <% If Request.Form(&quo
- 本文实例讲述了PHP实现逐行删除文件右侧空格的方法。分享给大家供大家参考,具体如下:在编辑整理代码的过程中发现网上的一些代码经常会有不少的右
- 一、前言刚开始学Python的小伙伴可能会觉得每次写Python打开Cmd或者idle有点烦躁,没有代码补全也没有格式提示等。所以直接上手了
- 一、同一台电脑需要安装2个MYSQL,以mysql-5.7.39和mysql-8.0.30为例; 1.下载:https://dow
- SQL server2000数据库应用非常广泛,一旦出现安全问题,造成的损失往往难以估量!应提前预防,防患于未然。这里,我们主要谈论有关SQ
- 本文实例讲述了Python实现的爬取百度文库功能。分享给大家供大家参考,具体如下:# -*- coding: utf-8 -*-from s
- 本文实例讲述了Python使用urllib2模块实现断点续传下载的方法。分享给大家供大家参考。具体分析如下:在使用HTTP协议进行下载的时候
- 目录pandas创建对象SeriesDataFrame高级索引(花式索引)loc标签索引iloc 位置索引ix 标签与位置混合索引增加数据本
- 又一个js加密工具:js混淆,完整源代码如下,有点长呵呵:<HTML><HEAD><TITLE>Cunf
- 1、先看看什么是 iterable 对象以内置的max函数为例子,查看其doc:>>> print max.__doc__
- 简单的‘Hello World!'Python命令行假设你已经安装好了Python, 那么在Linux命令行输入:$python将直
- 虽然每个图像具有多个通道和多层卷积层。例如彩色图像具有标准的RGB通道来指示红、绿和蓝。但是到目前为止,我们仅展示了单个输入和单个输出通道的
- 前言大家应该都有所了解,下面就简单介绍下Numpy,NumPy(Numerical Python)是一个用于科学计算第三方的Python包。
- 一维插值插值不同于拟合。插值函数经过样本点,拟合函数一般基于最小二乘法尽量靠近所有样本点穿过。常见插值方法有拉格朗日插值法、分段插值法、样条
- 导语不少人在生活中都有抠人像图换背景的需求。那怎么抠图呢?相信不少人第一时间就想到了 PS 抠图 * ,为了学会 PS 抠图很多人还花费不少精
- import pdbdef pdb_test(arg): for i in range(arg):&nb
- 官方实现golang 1.8 及以上版本提供了一个创建共享库(shared object)的新工具,称为 Plugins。目前 Plugin
- 1.文档对象模型(DOM)DOM是HTML和XML文档的编程基础,它定义了处理执行文档的途径。编程者可以使用DOM增加文档、定位文档结构、填
- 本文实例讲述了PHP基于非递归算法实现先序、中序及后序遍历二叉树操作。分享给大家供大家参考,具体如下:概述:二叉树遍历原理如下:针对上图所示