C++ virtual继承

C++ virtual继承的另一种名称是菱形继承,主要目的是用于解决从不同类继承来的同名数据成员在内存中有不同的拷贝,造成数据不统一的

问题,以致于在进行类释放时造成内存泄漏。将共同的基类作为虚基类,这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同

一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。

如下是实现格式:

class 派生类名:virtual 继承方式  基类名   //virtual是关键字,声明该基类为派生类的虚基类。

在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用。

声明了虚基类之后,虚基类在进一步派生过程中始终和派生类一起,维护同一个基类子对象的拷贝

由于懒画图引用别人的一个,请大家原谅,谢谢理解:

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;
};
</pre><pre name="code" class="cpp">class Test1 : public virtual CBase
{
public:
//...
};

class Test2 : public virtual CBase
{
public:
//...
};

class Test3 : public Test1, public Test2
{
public:
//...
};

如果没有虚继承则在对象释放时m_buffer会进行两次释放。

时间: 2024-08-27 23:35:31

C++ virtual继承的相关文章

sizeof 和类继承 虚继承 求类大小

代码: #include <iostream> using namespace std; /* class a{ float k; // 4字节 virtual void foo(){} //有一个4字节的指针指向自己的虚函数表 }; class b : virtual public a{ virtual void f(){} }; 有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节:还要包括类a的字节数,所以类b的字节数就求出来了. 运行结果: 8 16 */ /* clas

C++继承与派生

2017-06-25 23:00:59 c++中的继承和派生是面向对象编程中的一个重要内容,通过继承可以实现代码的复用,同时继承也是实现多态性的基础. 一.c++继承的基本形式 class 派生类名:继承方式 基类名,继承方式 基类名 {}: 继承方式主要有三种,public ,private ,protected. 缺省条件下是private继承,三种中public继承用的最多,不同的继承方式决定了子类中从基类继承过来的成员的访问属性. public继承: 基类的public,protecte

多重继承,虚继承,MI继承中虚继承中构造函数的调用情况

先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: [cpp] view plain copy print? //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; } ~base()

继承&派生

一.什么是继承和派生 封装.继承.多态是C++的三个重要的特性.在面向对象的技术中强调软件的可重用性,而继承机制就是用来解决软件的重用问题.在C++中,所谓"继承"就是在一个已经存在的类的基础上建立一个新的类.已经存在的类成为基类或父类,新建立的类称为派生类或子类. 一个类从一个已有的类那里获得已有的特性,这种现象称为类的继承.通过继承,一个新建的子类从父类那里获得父类的特性.从另一角度说,从已有的类(父类)产生一个新的类(子类),称为类的派生.派生类继承类基的所有数据成员和成员函数,

C++虚继承解说

1.概括 在CPlusPlus多继承编程中时常遇到这样一个问题--若子类实现多个基类或接口继承,多基类或接口中存在成员名相同,在客户与实现类之间的通信时编译器报错"不能这样使用,会产生二义性"由于这个问题的解决方法很多.比如说,可以把相同的成员名给改过来.但是,从专业的角度,可能虚拟继承会解决这个问题.那接下来我看看c++是怎么避免这种问题的. 2.概念 当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一

5、继承与派生6-虚基类

当某类的部分或全部直接基类是从另一个共同基类派生而来时,在这些直接基类中从上一级共同基类继承来的成员就拥有相同的名称.在派生类的对象中,这些同名数据成员在内存中同时拥有多个拷贝,同一个函数名会有多个映射.我们可以使用作用域分辨符来惟一标识并分别访问他们,也可以将共同基类设置为虚基类,这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射.这样就解决了同名成员的惟一标识问题. 虚基类的声明是在派生类的定义过程中进行的,语法形式: class 派生类名:virtua

面向对象:继承、抽象类、抽象方法、虚方法

1.继承什么是继承?目的:代码重用public class 子类:父类{ }父类 基类 被继承的类子类 派生类 需要继承的类 父类构造函数的继承创建子类对象时,先调用父类构造函数,再调用子类构造函数默认调用父类无参构造函数如果子类有无参构造函数,要求父类也有无参构造函数如果调用父类的有参构造函数,显式用base调用 public 子类(参数列表)base(实参)实参:要调用的父类的有参构造函数的参数列表{} base:父类对象(父类实例) 2.抽象abstract 抽象方法:访问修饰符 abst

嵌入式linux C++语言(七)——继承与派生

嵌入式linux C++语言(七)--继承与派生 一.继承 在C++编程中软件可重用性(software reusability)是通过继承(inheritance)机制来实现的.类的继承,是新的类从已有类那里得到已有的特性.或从已有类产生新类的过程就是类的派生.原有的类称为基类或父类,产生的新类称为派生类或子类. 派生类的声明:class 派生类名:[继承方式] 基类名{派生类成员声明:};    一个派生类可以同时有多个基类,这种情况称为多重继承,派生类只有一个基类,称为单继承. 继承方式规

Effective C++笔记06:继承与面向对象设计

关于OOP 博客地址:http://blog.csdn.net/cv_ronny 转载请注明出处! 1,继承可以是单一继承或多重继承,每一个继承连接可以是public.protected或private,也可以是virtual或non-virtual. 2,成员函数的各个选项:virtual或non-virtual或pure-virtual. 3,成员函数和其他语言特性的交互影响:缺省参数值与virtual函数有什么交互影响?继承如何影响C++的名称查找规则?设计选项有如些?如果class的行为