C++ 中继承与动态内存分配的详解

 更新时间:2017年08月21日 08:39:33   投稿:lqh  
这篇文章主要介绍了C++ 中继承与动态内存分配的详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下

C++ 中继承与动态内存分配的详解

继承是怎样与动态内存分配进行互动的呢?例如,如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将怎样影响派生类的实现呢?这个问题的答案取决于派生类的属性。如果派生类也使用动态内存分配,那么就需要学习几个新的小技巧。下面来看看这两种情况:

一.派生类不使用new

派生类是否需要为显示定义析构函数,复制构造函数和赋值操作符呢?

不需要!

首先,来看是否需要析构函数,如果没有定义析构函数,编译器将定义一个不执行任何操作的默认构造函数。实际上,派生类的默认构造函数总是要执行一些操作:执行自身的代码后调用基类析构函数。因为我们假设派生类的成员不需要执行任何特殊操作,所以默认析构函数是合适的。

再看复制构造函数。默认复制构造函数执行成员复制,这对于动态内存分配来说是不合适的,但对于新的派生类的成员来说是合适的。因此只需要考虑继承的基类的对象。要知道,成员复制将根据数据类型采用相应的复制方式,因此复制类成员或继承的类组件时,则是使用该类的复制构造函数完成的。所以派生类的默认复制构造函数使用基类的显示复制构造函数来复制派生类对象的基类成员部分。因此,默认复制构造函数对于新的派生类而言是合适的。

对于赋值来说,同样道理。

二.派生类使用new。

如果派生类需要new操作,那么需要显示定义析构函数,复制构造函数和赋值操作符。

派生类析构函数自动调用基类的构造函数,故其自身的职责是对派生类构造函数执行工作的进行清理。

接下来看复制构造函数:

DerivedClass::DerivedClass(const DerivedClass& de):BaseClass(de)
{
//.......
}

看赋值操作符:

DerivedClass::operator=(const DerivedClass& de)
{
if(this == &de) return *this;
BaseClass::operator=(de);
//..........
}

总之,当基类和派生类都采用动态内存分配时,派生类的析构函数,复制构造函数以及赋值操作符都必须使用想用的基类方法来处理基类元素。这种要求是通过三种不同的方式来满足的。

1.对于析构函数,这是自动完成的;

2.对于构造函数,这是通过在初始化成员列表中调用基类的复制构造函数来完成的;如果不是这样做,将自动调用基类的默认构造函数。

3.对于复制操作符,这是通过使用作用域解析操作符显示的调用基类的赋值操作符来完成了。

以上就是C++ 中继承与动态内存分配的详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:

相关文章

  • C++实现LeetCode(37.求解数独)

    C++实现LeetCode(37.求解数独)

    这篇文章主要介绍了C++实现LeetCode(37.求解数独),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言关于include顺序不同导致编译结果不同的问题

    C语言关于include顺序不同导致编译结果不同的问题

    这篇文章主要介绍了在日常调试C语言中include的顺序不同从而影响最后编译结果不同的问题,究其原因是写代码的习惯所导致,下面跟小编一起来看看吧
    2022-04-04
  • C语言实现各种排序算法实例代码(选择,冒泡,插入,归并,希尔,快排,堆排序,计数)

    C语言实现各种排序算法实例代码(选择,冒泡,插入,归并,希尔,快排,堆排序,计数)

    排序算法是算法之中相对基础的,也是各门语言的必学的算法,这篇文章主要介绍了C语言实现各种排序算法(选择,冒泡,插入,归并,希尔,快排,堆排序,计数)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • C++基于Boost库实现命令行解析

    C++基于Boost库实现命令行解析

    Boost库中默认自带了一个功能强大的命令行参数解析器,以往我都是自己实现参数解析的,今天偶尔发现这个好东西,就来总结一下参数解析的基本用法,该库需要引入program_options.hpp头文件,即可使用了
    2021-06-06
  • C++实现AVL树的示例详解

    C++实现AVL树的示例详解

    AVL Tree 是一个「加上了额外平衡条件」的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(log_2N),本文主要介绍了AVL树的实现,需要的可以参考一下
    2023-03-03
  • C语言实现分治法实例

    C语言实现分治法实例

    这篇文章主要为大家详细介绍了C语言实现分治法的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • QT计算时间差的方法详解

    QT计算时间差的方法详解

    这篇文章主要为大家详细介绍了利用QT实现计算两个时间的时间差的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 如何将C语言代码转换为应用程序(也就是编译)

    如何将C语言代码转换为应用程序(也就是编译)

    有时候我们将让我们的c语言代码保存为一个exe方便,方便使用,实际就是我们俗说的编译
    2013-07-07
  • C++零基础精通数据结构之带头双向循环链表

    C++零基础精通数据结构之带头双向循环链表

    带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单
    2022-03-03
  • 在C++中高效使用和处理Json格式数据的示例代码

    在C++中高效使用和处理Json格式数据的示例代码

    最近的项目在用c处理后台的数据时,因为好多外部接口都在使用Json格式作为返回的数据结构和数据描述,如何在c中高效使用和处理Json格式的数据就成为了必须要解决的问题,需要的朋友可以参考下
    2023-11-11

最新评论