C++ virtual继承
C++ virtual继承的还有一种名称是菱形继承。主要目的是用于解决从不同类继承来的同名数据成员在内存中有不同的拷贝。造成数据不统一的问题,以致于在进行类释放时造成内存泄漏。
将共同的基类作为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就仅仅有一个拷贝,同一个函数名也仅仅有一个映射。这样不仅就攻克了二义性问题,也节省了内存,避免了数据不一致的问题。
例如以下是实现格式:
class 派生类名:virtual 继承方式 基类名 //virtual是keyword。声明该基类为派生类的虚基类。
在多继承情况下,虚基类keyword的作用范围和继承方式keyword同样,仅仅对紧跟其后的基类起作用。声明了虚基类之后。虚基类在进一步派生过程中始终和派生类一起,维护同一个基类子对象的拷贝。因为懒绘图引用别人的一个。请大家原谅,谢谢理解:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VucmVuaHVhMDg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
class CBase
{
public:
CBase(unsigned int len) : m_buffer(0)
{
if(len > 0)
{
m_buffer = new char[len];
}
} ~CBase
{
if(NULL != m_buffer)
{
delete [] m_buffer;
m_buffer = NULL;
}
} private:
char* m_buffer;
};
class Test1 : public virtual CBase
{
public:
//...
}; class Test2 : public virtual CBase
{
public:
//...
}; class Test3 : public Test1, public Test2
{
public:
//...
};
假设没有虚继承则在对象释放时m_buffer会进行两次释放。
C++ virtual继承的更多相关文章
- C++中virtual继承的深入理解
今天专门看了一下虚继承的东西,以前都没怎么用过,具体如下:父类: 复制代码代码如下: class CParent { .... }; 继承类的声明比较特别: class CChild : ...
- 【C++】继承(虚基类)
类的继承与派生 面向对象技术强调软件的可重用性,这种重用性通过继承机制来实现.而在类的继承过程中,被重用的原有类称为基类,新创建的类称为派生类.派生类定义语法格式如下: class <派生类名& ...
- 虚基类&虚继承
发现这个月准备竞赛完全没有更新哎... 改了下某华大一c++测试题...网上对虚继承讲的要么太繁琐要么不到位,自力更生 #include<iostream> #include<fst ...
- c/c++: c++继承 内存分布 虚表 虚指针 (转)
http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base { pu ...
- 再谈C++继承
一.三种继承方式 private 基类的公有成员与保护成员成为派生类的私有成员 public 基类的成员访问权限不变 protected 基类的公有成员与保护成员将成为派生类的保护成员 二.三种 ...
- C++中的多重继承与虚继承的问题
1.C++支持多重继承,但是一般情况下,建议使用单一继承. 类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况: A A \ / B C ...
- c++ 虚继承
虚继承(个人感觉用到的地方不多,项目中没有用到这个的) 最典型的例子就是iostream的继承方式 class istream : virtual public ios{...};//此处就是虚继承, ...
- C++学习之虚继承
http://blog.csdn.net/wangxingbao4227/article/details/6772579 C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同 ...
- C/C++基础知识总结——继承与派生
1. 类的继承与派生 1.1 派生类的定义 (1) 定义规范 class 派生类名: 继承方式 基类1名, 继承方式 基类2名... { ...派生类成员声明; }; (2) 从以上形式上看可以多继承 ...
随机推荐
- Apache+Tomcat负载均衡问题集锦
之前在windows 环境下搭建了下apache+tomcat负载均衡(不会的能够參考之前的文档,文档对于linux和windows都适用),一帆风顺.没有出现不论什么问题.今天尝试着在linux下搭 ...
- calibre怎么转换文件格式
首先打开calibre软件,需要转换的书目不在列表的按照上一个教程将文件导入书籍列表. 选中需要转化格式的书籍之后右击,会跳出一个比较长的菜单栏,找到转换书籍选项,此处有两个选项,一个是逐个转换,另外 ...
- Dialog 样式 主题 标题 背景 使用【总结】
最重要的是这两行代码 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);//设置Dialog没有标题,需在setContentView之前设置 ...
- SQL PRIMARY KEY,SQL FOREIGN KEY
A primary key is defined as a column or a group of column that their value are always be unique. Nor ...
- ECharts学习总结(五):echarts的Option概览
注:下面内容摘自echarts官网,原文地址:http://echarts.baidu.com/doc/doc.html#%E9%80%89%E9%A1%B9 option 图表选项,包含图表实例任何 ...
- Java 中 方法名或类名 变更 同时 更新 所有引用的 类名或方法名 的解决方案
选中 类名,或属性名 Ctrl + 1 然后选择 理新当前文件,还是更新整个工作空间,然后修改对应的类名或方法名 回车即可. 如果.有SVN 版本在控制着,则 会提示,然后把对应的文件 锁定 再 ...
- akka模块
模块 Akka的模块化做得非常好,它为不同的功能提供了不同的Jar包. akka-actor-2.0.jar – 标准Actor, 有类型Actor,等等 akka-remote-2.0.jar – ...
- [NPM] Avoid Duplicate Commands by Calling one NPM Script from Another
We can get a lot of utility through CLI tools invoked via npm scripts. Many of these tools have APIs ...
- Android 代码实现来电拦截
为了更好地理解这个Demo,我先向大家介绍一下需求与功能. 需求: 每天都会有很多无聊的电话,比如推销商品等,占用我们大量时间不说,有时候还会打乱我们的思路,扰乱我们的正常生活.所以实现一个对某些号码 ...
- Android下文件的压缩和解压(Zip格式)
Zip文件结构 ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体. 文件实体由一个头部和文件数据组,Central Directory由多个File he ...