C++之继承和动态内存分配
        如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将如何影响派生类的实现呢?这取决于派生类的属性,如果派生类也使用动态内存分配,这将如何实现呢?这种大致分为两种情况,
第一种情况:派生类不使用new
        这将不需要在派生类中显式的定义析构函数,复制构造函数,赋值操作符。如果在派生类中没有定义析构函数,编译器将定义一个不执行任何操作的默认构造函数,实际上,派生类的默认构造函数总要进行一些操作:执行自身的代码后调用基类析构函数。因为派生类没有任何特殊操作,所以使用默认析构函数是合适的。
        接下来看复制构造函数,默认复制构造函数执行成员复制,这对于动态内存分配来说是不合适的,但对于派生类成员来说是合适的,因此只需要考虑继承的基类对象,成员复制将根据数据类型采用相应的复制方式,复制类成员或者集成的类组件的时候,则是使用该类的复制构造函数完成的。所以,派生类的默认复制构造函数使用显式基类复制构造函数来复制派生类对象的基类部分。因此,默认复制构造函数对于新的派生类成员来说是合适的,同时对于继承的基类对象来说也是合适的。
        对于赋值来说,累的默认赋值操作符将自动使用基类的赋值操作符来对基类组件进行赋值。因此,默认的赋值操作符也是合适的。
        派生类对象的这些属性也适用于本身是对象的类成员。
第二种情况:派生类使用new
        在这种情况下,必须为派生类定义显式析构函数,赋值操作符,复制构造函数。
        派生类析构函数自动调用基类的析构函数,所以他自身的职责是对派生类构造函数执行工作进行清理。因此,派生类析构函数必须释放为变量动态分配的内存,并依赖于基类的析构函数来释放为基类变量动态分配的内存。
        派生类的复制构造函数只能访问派生类的数据,因此它必须调用基类复制构造函数来处理共享的基类数据。需要注意的是,成员初始化列表将一个派生类引用传递给基类构造函数,没有参数类型为派生类引用的基类构造函数,也不需要这样的构造函数。因为基类的复制构造函数有一个基类的引用参数,而基类引用可以指向派生类型。因此,基类复制构造函数将使用派生类参数的基类部分来构造新对象的基类部分。
       接下来看赋值操作符,由于派生类也使用动态内存分配,所以它也需要一个显式赋值操作符。作为派生类的方法,它只能直接访问派生类的数据,然而,派生类的显式复制操作符必须负责所有继承的基类对象的复制,可以通过显式调用基类赋值操作符来完成这项工作。
        总之,当基类和派生类都采用动态内存分配的时候,派生类的析构函数,复制构造函数以及赋值操作符都必须使用相应的基类方法来处理基类元素。这种要求是通过三种不同的方式来满足的,对于析构函数,这是自动完成的;对于构造函数,这是通过在初始化成员列表中调用基类的复制构造函数来完成的,如果不这样做,将自动调用基类的默认构造函数,对于赋值操作符,这是通过使用作用域操作符显式的调用基类的赋值操作符来完成的。

C++之继承和动态内存分配的更多相关文章

  1. C++解析(25):关于动态内存分配、虚函数和继承中强制类型转换的疑问

    0.目录 1.动态内存分配 1.1 new和malloc的区别 1.2 delete和free的区别 2.虚函数 2.1 构造函数与析构函数是否可以成为虚函数? 2.2 构造函数与析构函数是否可以发生 ...

  2. C++_类继承6-继承和动态内存分配

    如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将怎样影响派生类的实现?这个问题的答案取决于派生类的属性.如果派生类也使用动态内存分配,那就需要注意学习新的小技巧. 派生类不适用new // ...

  3. C++学习笔记(十一):void*指针、类型转换和动态内存分配

    void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void ...

  4. Java静态内存与动态内存分配的解析

    1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用 ...

  5. C++指针和动态内存分配

    指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...

  6. SQLite剖析之动态内存分配

    SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性    SQLite内核和它的内存分配子系统提供以下特性 ...

  7. C和指针 第十一章 动态内存分配

    声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...

  8. 动态内存分配导致Javascript性能的问题

    内存分配对性能的影响是很大的,分配内存本身需要时间,垃圾回收器回收内存也需要时间,所以应该尽量避免在堆里分配内存.不过直到最近优化HoLa cantk时,我才深刻的体会到内存分配对性能的影响,其中有一 ...

  9. C++动态内存分配

    C++动态内存分配1.堆内存分配 :C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念:通常定 ...

随机推荐

  1. 做ie8css样式时浏览器默认杂项模式遇到的一个小坑

    1 进行ie浏览器的样式兼容的时候,首先要确保打开浏览器浏览网页的时候的文本模式要为当前浏览器的"标准模式",注意<!DOCTYPE html>不缺失不错误,以免浏览器 ...

  2. 性能监控工具javamelody与spring的集成

    详细信息可以访问javamelody的官方网站 我在集成的过程中,一直出现commonHibernateDao的加载问题, 另外,根据官方文档,如果你的应用与monitoring-spring.xml ...

  3. leetcode Swap Nodes in Pairs python

    # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ...

  4. PHP程序输出日历

    以下代码只是简单实现日历的效果和逻辑思路,没有使用类封装,权当抛砖引玉,有兴趣的朋友可以封装起来,方便调用. <?php /** * PHP利用时间函数输出日历 * Rain.zen $ int ...

  5. HTML5 canvas易错点

    一.画布的默认宽高 <canvas id="myCanvas" style="border:1px solid black;"> 你的浏览器不支持h ...

  6. Ajax中XML和JSON格式的优劣比较

    刚做完一个小的使用Ajax的项目.整个小项目使用JavaScript做客户端,使用PHP做服务器端.利用xmlHttpRequest组件作为交互工具,利用XML作为数据传输的格式.做完后基本做一个简单 ...

  7. JDBC连接数据库概述

    直接介绍JDBC连接数据库的流程及其原理 创建一个以JDBC连接数据库的程序,包含7个步骤 1.加载JDBC数据库驱动 在连接数据库之前,首先要加载想要连接的数据库的驱动,就是数据库厂商提供的jar包 ...

  8. xampp环境安装swoole

    手动编译php运行环境经常遇到函数库依赖的问题,这个错误搞定了,又蹦出来那个错误,很棘手,为了快速搭建一个swoole开发环境,于是另辟蹊径,直接下载安装xampp for linux,然后在用xam ...

  9. [摘]ASP.Net标准控件(TextBox控件)

    TextBox控件 TextBox控件又称文本框控件,为用户提供输入文本的功能. 1.属性 TextBox控件的常用属性及说明如表1所示. 表1 TextBox控件常用属性及说明 属    性 说   ...

  10. qutIm编译

    官网:http://www.qutim.org/ 原文地址:http://wiki.qutim.org/en/building_from_git 依赖: Qt4-dev 4.7:http://qt-p ...