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) 从以上形式上看可以多继承 ...
随机推荐
- 7)Linux程序设计入门--网络编程
)Linux程序设计入门--网络编程 Linux系统的一个主要特点是他的网络功能非常强大.随着网络的日益普及,基于网络的 应用也将越来越多. 在这个网络时代,掌握了Linux的网络编程技术,将令每一个 ...
- 关于TagHelper的那些事情——自定义TagHelper(格式化输出、依赖注入使用)
自定义TagHelper的最后一步就是在Process方法或ProcessAsync方法中添加展现代码.熟悉WebControl开发的朋友都知道Render方法,在这个方法中会添加展现的Html元素和 ...
- 《Android Studio有用指南》4.27 使用演示模式
本文节选自<Android Studio有用指南> 第4章第27节 作者: 毕小朋 眼下本书已上传到百度阅读, 在百度中搜索[Anroid Studio有用指南]便能够找到本书. 什么是演 ...
- 运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)
一般的我们喜欢这样对对象赋值: Person p1;Person p2=p1; classT object(another_object), or A a(b); classT object = ...
- javascript常用技巧归纳
最近归纳了下,发现还很多的哦1 javascript捕捉方向键 <HTML><HEAD><title>反选</title><script lan ...
- qt study 泛型和容器
所谓泛型(generic) 能够像操作基本类型一样轻松操作对象的类和函数. qt容器类就是泛型类,基于模板的泛型类. 重载运算符overloaed operator, 托管容器 managed con ...
- 要点Java20 java.util.Collections
java.util.Collections 集合帮助类 演示样例程序(JUnit演示) 排序 @Test public void testSort() { List<Integer> de ...
- Codeforces Round #250 (Div. 1) D. The Child and Sequence
D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input st ...
- Was liberty资料总结
WebSphere Application Server Liberty Profile Guide for Developers: http://www.redbooks.ibm.com/redbo ...
- python获取系统时间代码解析
import time print time.time() 输出的结果是: 1279578704.6725271 但是这样是一连串的数字不是我们想要的结果,我们可以利用time模块 ...