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

  1. C++中virtual继承的深入理解

    今天专门看了一下虚继承的东西,以前都没怎么用过,具体如下:父类: 复制代码代码如下: class   CParent { .... }; 继承类的声明比较特别: class   CChild   :  ...

  2. 【C++】继承(虚基类)

    类的继承与派生 面向对象技术强调软件的可重用性,这种重用性通过继承机制来实现.而在类的继承过程中,被重用的原有类称为基类,新创建的类称为派生类.派生类定义语法格式如下: class <派生类名& ...

  3. 虚基类&虚继承

    发现这个月准备竞赛完全没有更新哎... 改了下某华大一c++测试题...网上对虚继承讲的要么太繁琐要么不到位,自力更生 #include<iostream> #include<fst ...

  4. c/c++: c++继承 内存分布 虚表 虚指针 (转)

    http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base  {  pu ...

  5. 再谈C++继承

    一.三种继承方式 private 基类的公有成员与保护成员成为派生类的私有成员 public   基类的成员访问权限不变 protected  基类的公有成员与保护成员将成为派生类的保护成员 二.三种 ...

  6. C++中的多重继承与虚继承的问题

    1.C++支持多重继承,但是一般情况下,建议使用单一继承. 类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况: A          A \          / B     C ...

  7. c++ 虚继承

    虚继承(个人感觉用到的地方不多,项目中没有用到这个的) 最典型的例子就是iostream的继承方式 class istream : virtual public ios{...};//此处就是虚继承, ...

  8. C++学习之虚继承

    http://blog.csdn.net/wangxingbao4227/article/details/6772579 C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同 ...

  9. C/C++基础知识总结——继承与派生

    1. 类的继承与派生 1.1 派生类的定义 (1) 定义规范 class 派生类名: 继承方式 基类1名, 继承方式 基类2名... { ...派生类成员声明; }; (2) 从以上形式上看可以多继承 ...

随机推荐

  1. gdb对应vc调试命令

    gdb vc调试对照表: 实现功能                vc                   gdb 修改后编译              f7                   ma ...

  2. js 的push方法

    JavaScript push() 方法 定义和用法 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 语法 arrayObject.push(newelement1,newele ...

  3. 神经网络可以拟合任意函数的视觉证明A visual proof that neural nets can compute any function

    One of the most striking facts about neural networks is that they can compute any function at all. T ...

  4. python的异常机制使用技巧

    1.当你开发的接口被其他应用调用时,响应要及时,但是有些要触发的操作很耗时间. 比如下面需要通过被调用触发的函数create_job_1().但是这个函数执行会比较消耗时间 2.于是,我们可以利用异常 ...

  5. RMAN备份与恢复总汇

    1.1  备份 1.1.1 对数据库进行全备 使用backup database命令执行备份 RMAN> BACKUP DATABASE; 执行上述命令后将对目标数据库中的所有数据文件进行备份, ...

  6. go语言基础之包和自定义包与main包

    1.包 所有 Go 语言的程序都会组织成若干组文件,每组文件被称为一个包.这样每个包的代码都可以作为很小的复用单元,被其他项目引用. 一个包的源代码保存在一个或多个以.go为文件后缀名的源文件中,通常 ...

  7. Linux下Anaconda的安装使用与卸载及问题解决

    1. 安装 到官网下载对应的版本文件:Download Anaconda Now! 下载完之后,在终端输入: bash 下载好的文件 整个过程点几下回车就好了.但是到最后一步,会提示是否把anacon ...

  8. 图结构练习——BFS——从起始点到目标点的最短步数(邻接表+BFS)

    图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 在古老的魔兽传说中.有两个军团,一个 ...

  9. UNIX网络编程读书笔记:pselect函数

    函数原型 pselect函数是由POSIX发明的,其原型如下: #include <sys/select.h> #include <signal.h> #include < ...

  10. Jquery重新学习之二[属性attr(),removeAttr(),prop(),removeProp()]

    1:属性.attr(name|pro|key,val|key,fn)与removeAttr(name) 1.1 .attr(name) 参数name为属性名称 <a id="my_hr ...