返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++继承和动态内存分配
  • 945
分享到

C++继承和动态内存分配

2024-04-02 19:04:59 945人浏览 八月长安
摘要

目录1.简介2.派生类不用new3.派生类使用new文章转自微信 公众号:Coder梁(ID:Coder_LT) 1.简介 这里面有一个问题,当我们的基类使用动态内存分配,并且重新定

文章转自微信 公众号:Coder梁(ID:Coder_LT)

1.简介

这里面有一个问题,当我们的基类使用动态内存分配,并且重新定义赋值和复制构造函数,这会对派生类的实现有什么影响呢?

我们来看两种情况:

2.派生类不用new

假设基类中使用了动态内存分配:

class baseDMA {
 private:
     char *label;
     int rating;
    public:
     baseDMA(const char* l="null", int r=0);
     baseDMA(const baseDMA& rs);
     virtual ~baseDMA();
     baseDMA &operator=(const baseDMA& rs);
};

在这个声明里包含了构造函数、析构函数、复制构造函数和重载赋值运算符。

现在假设我们从baseDMA派生出了类lackDMA,但是后者不使用new

class lackDMA: public baseMDA {
   private:
     char color[40];
    public:
     ...
};

问题来了,我们要不要给lackDMA这个类定义析构函数、复制构造函数和赋值运算符呢?

答案是不需要。

首先是析构函数,这个很好想明白,如果我们没有定义析构函数,那么编译器会自动定义一个不执行任何操作的默认析构函数。实际上派生类的析构函数往往会在执行一些逻辑之后调用基类的构造函数,因为lackDMA类中的成员不是通过new创建的,因此不需要额外的操作,所以默认析构函数是合适的。

同样的默认复制构造函数也会执行非new创建成员的复制,所以对于color变量来说是没问题的。并且在派生类当中,默认复制构造函数除了会复制非new创建的成员之外,还会调用基类的复制构造函数来复制父类成员的部分。所以,对于派生类lackDMA来说,我们使用默认的复制构造函数一样没有问题。

赋值也是一样的,默认的赋值运算符也会自动使用基类的赋值运算符来对基类的成员进行赋值。

3.派生类使用new

我们再来看看派生类当中使用了new的情况。

class hasDMA: public baseMDA {
   private:
     char *style;
    public:
     ...
};

hasDMA这个类当中,我们添加了一个需要使用new创建的char*成员。在这种情况下,我们就没办法使用默认的函数了,就必须定义显式析构函数、复制构造函数和赋值运算符了,我们一个一个来看。

首先是析构函数,派生类的析构函数会自动调用基类的析构函数,所以我们只需要在析构函数当中释放派生类中独有的成员变量即可。

hasDMA::~hasDMA() {
    delete []style;
}

然后我们再来看看拷贝构造函数,由于派生类不能访问基类private成员,所以我们需要调用基类的拷贝构造函数。

hasDMA::hasDMA(const hasDMA& hs): baseDMA(hs) {
    style = new char[std::strlen(hs.style) + 1];
    std::strcpy(style, hs.style);
}

最后是赋值运算符,同样,由于派生类不能访问基类中私有成员,我们也需要借助基类的赋值运算符:

hasDMA &hasDMA::operator(const hasDMA& hs) {
    if (this == &hs) return *this;
    baseDMA::operator=(hs);
    delete []style;
    style = new char[std::strlen(hs.style) + 1];
    std::strcpy(style, hs.style);
    return *this;
}

这当中有一个语句看起来有些奇怪:

baseDMA::operator=(hs);

这是我们手动显式调用了基类的赋值运算符,我们直接用等于号赋值也有同样的效果:

*this = hs;

为什么不这么干呢?这是因为编译器在执行的时候会默认调用子类的赋值运算符hasDMA::operator=,从而导致一直递归导致死循环。

所以我们需要手动写明作用域解析符,表明这是调用的父类赋值运算符,而非派生类的运算符,这一点比较隐晦,要千万注意。

到此这篇关于c++继承和动态内存分配的文章就介绍到这了,更多相关C++继承和动态内存分配内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++继承和动态内存分配

本文链接: https://lsjlt.com/news/163404.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++继承和动态内存分配
    目录1.简介2.派生类不用new3.派生类使用new文章转自微信 公众号:Coder梁(ID:Coder_LT) 1.简介 这里面有一个问题,当我们的基类使用动态内存分配,并且重新定...
    99+
    2024-04-02
  • C++ 继承,虚继承(内存结构)详解
    目录普通的公有继承多重继承虚继承虚继承(菱形继承)总结普通的公有继承 class test1 { public: test1(int i) :num1(i) {} pri...
    99+
    2024-04-02
  • C语言的动态内存分配及动态内存分配函数详解
    目录mallocmalloc的使用:freecalloccalloc的使用:reallocrealloc的使用改进:realloc的另一种用法:常见的动态内存错误对空指针的解引用操作...
    99+
    2024-04-02
  • C++ 动态内存分配详解(new/new[]和delete/delete[])
    一、为什么需要动态内存分配? 在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的。 但是可能存在程序的内存需求只能在运行时确定的情况。 例如,当需要的内存取决于...
    99+
    2024-04-02
  • 怎么在C++中动态内存分配
    今天就跟大家聊聊有关怎么在C++中动态内存分配,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。按需分配,根据需要分配内存,不浪费。内存拷贝函数void* memcpy(void* de...
    99+
    2023-06-14
  • 如何在c++中分配动态内存
    今天就跟大家聊聊有关如何在c++中分配动态内存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。动态申请内存操作符 newnew 类型名T(初始化参数列表)功能:在程...
    99+
    2023-06-06
  • C++存储方案和动态分配
    目录存储方案和动态分配 初始化 存储方案和动态分配 在之前的文章当中,我们讨论了C++用来为变量分配内存的5种方案,但是这些方案并不适用于使用new运算符分配的内存,这种内存被称为...
    99+
    2024-04-02
  • 带你了解C++的动态内存分配
    目录new与delete运算符动态分配数组动态分配字符串总结new与delete运算符 数组在定义时就规定了其长度,这使得它的内存空间也固定了下来,这称为静态内存分配。 内存申请大了...
    99+
    2024-04-02
  • C语言的动态内存如何分配
    今天小编给大家分享一下C语言的动态内存如何分配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。动态内存分配的定义首先我们要搞清...
    99+
    2023-07-02
  • AndroidNDK开发(C语言--动态内存分配)
    1.C 内存管理函数 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 ...
    99+
    2024-04-02
  • 详解C语言动态内存的分配
    目录C 程序中,不同数据在内存中分配说明内存动态分配的相关函数应用实例动态分配内存的基本原则总结C 程序中,不同数据在内存中分配说明 1)全局变量——内存中的...
    99+
    2024-04-02
  • 浅谈Java继承中的转型及其内存分配
    看书的时候被一段代码能凌乱啦,代码是这样的:package 继承;abstract class People { public String tag = "疯狂Java讲义"; //① public String na...
    99+
    2023-05-30
    java 继承 内存
  • C语言如何实现动态内存分配
    今天小编给大家分享一下C语言如何实现动态内存分配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C语言动态内存分配的详解1.为...
    99+
    2023-06-16
  • C语言动态内存分配图文讲解
    目录思维导图1.为什么存在动态内存分配2.动态内存函数的介绍2.1 malloc2.2 free2.3 calloc2.4 realloc3.常见的动态内存错误思维导图 1.为什么...
    99+
    2023-01-17
    C语言动态内存分配 C语言动态内存分配函数
  • C语言动态内存分配怎么使用
    这篇文章主要介绍了C语言动态内存分配怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态内存分配怎么使用文章都会有所收获,下面我们一起来看看吧。一、动态内存分配的意义C语言中的一切操作都是基于内存的...
    99+
    2023-06-30
  • C语言中的动态内存分配实例分析
    本篇内容主要讲解“C语言中的动态内存分配实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中的动态内存分配实例分析”吧!什么是动态内存分配我们目前已经知道的内存开辟的方式有:int&n...
    99+
    2023-07-02
  • C语言动态内存的分配最全面分析
    目录为什么有动态内存分布malloc函数的使用free函数的用法calloc的用法realloc的使用方法柔性数组为什么有动态内存分布 大家发现一个问题没有,就是我们之前写代码创建数...
    99+
    2024-04-02
  • C++使用动态内存分配的原因解说
    上节我们讲了C++程序的内存分布。C++程序的内存分布 本节来介绍为什么要进行内存分配。 按需分配,根据需要分配内存,不浪费。 内存拷贝函数void* memcpy(void* de...
    99+
    2024-04-02
  • C语言动态内存分配函数的实现
     在C中我们开辟内存空间有两种方式 : 1.静态开辟内存 :例如: int a;int b[10];  这种开辟内存空间的特点是 所开辟的内存是在栈中开...
    99+
    2024-04-02
  • C语言动态内存的分配实例详解
    目录前言动态内存分配的定义动态内存的优势<1>  可以控制内存的大小<2> 可以多次利用这部分空间<3>不占用栈区的内存malloc c...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作