zoukankan      html  css  js  c++  java
  • C++ virtual继承

            C++ virtual继承的还有一种名称是菱形继承。主要目的是用于解决从不同类继承来的同名数据成员在内存中有不同的拷贝。造成数据不统一的问题,以致于在进行类释放时造成内存泄漏。

    将共同的基类作为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就仅仅有一个拷贝,同一个函数名也仅仅有一个映射。这样不仅就攻克了二义性问题,也节省了内存,避免了数据不一致的问题。
    例如以下是实现格式:

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

    在多继承情况下,虚基类keyword的作用范围和继承方式keyword同样,仅仅对紧跟其后的基类起作用。声明了虚基类之后。虚基类在进一步派生过程中始终和派生类一起,维护同一个基类子对象的拷贝。因为懒绘图引用别人的一个。请大家原谅,谢谢理解:

    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会进行两次释放。
  • 相关阅读:
    解决SecureCRT中文显示乱码
    能大大提升工作效率和时间效率的9个重要习惯
    PHP基础知识
    CI学习相关地址
    IE8引入JavaScript
    IE9以下不支持placeholder属性
    IE8浏览器兼容性问题
    简单的DOS命令
    Linux常用运维指令
    log4j日志+面向切面监控异常
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6768748.html
Copyright © 2011-2022 走看看