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. 依赖注入及AOP简述(十一)——生命周期管理 .

    2.     生命周期管理 各种依赖注入框架提供了替开发者管理各种Scope的便利功能,随之而来的就必然是被管理的依赖对象的生命周期管理的问题.所谓生命周期管理,就是一个对象在它所属的Scope中从被 ...

  2. 批处理就是windows的杰作啊

    今天要为了解决vs不能同时开启调试和编写的问题,我就上网查找了一些批处理的命令,用批处理调用exe,和打开txt,虽然一行代码就解决了但是我没用过啊,很陌生. call  路径\a.exe  就相当于 ...

  3. javascript高级知识点——函数原型

    代码信息来自于http://ejohn.org/apps/learn/. 向函数的原型中添加方法 function Ninja(){} Ninja.prototype.swingSword = fun ...

  4. C++_内部类

    C++ 内部类和外部类之间的相互调用

  5. OC语法10——@protocol协议,

    参考资料:博客 @protocol,协议: OC中protocol的含义和Java中接口的含义是一样的,它们的作用都是为了定义一组方法规范. 实现此协议的类里的方法,必须按照此协议里定义的方法规范来. ...

  6. centos安装中文支持(转)

    安装中文支持包. yum install fonts-chineseyum install fonts-ISO8859-2 -------- 一.安装中文支持方法1.在安装光盘中找到一下包进行安装.r ...

  7. Eclipse 修改编码格式

    在Eclipse的开发使用中,我们经常使用的是UTF-8,但是刚刚安装的或者是导入的项目是其他编码的默认是GBK的,这就造成我们的项目乱码,一些中文解析无法查看,对我们的开发造成不便. 修改工作空间默 ...

  8. GDB调试方法(转)

    一:列文件清单 1. List (gdb) list line1,line2 ************************************************************* ...

  9. C# 常用函数和方法集

    1.DateTime 数字型  System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=System. ...

  10. Delphi OleVariant 类型的用法

    因客户需求,对客户的指纹机与公司产品进行集成,需要对指纹机做接口的二次开发,郁闷的是产商只提供了VB和C的DEMO示例,没有Delphi的,公司没有VB,C的环境,不能打开这二种语言的示例,因为本公司 ...