虚析构和纯虚析构

2023-10-29 23:58
文章标签 虚析构 纯虚析构

本文主要是介绍虚析构和纯虚析构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码

解决方式:将父类中的析构函数改为虚析构或者纯虚构

虚析构和纯虚构共性:

  • 可以解决父类指针释放子类对象
  • 都需要有具体的函数实现

虚析构和纯虚构的区别:

  • 如果是纯虚析构,该类属于抽象类,无法实例化对象

虚析构语法:

virtual ~类名(){}

纯虚构语法:

virtual ~类名()=0;

 

#include<iostream>
using namespace std;
#include<string>//虚析构和纯虚构
class Animal
{
public:Animal(){cout << "Animal构造函数调用" << endl;}//利用虚析构可以解决父类指针释放子类对象时不干净的问题//virtual ~Animal()//{//	cout << "Animal析构函数调用" << endl;//}//纯虚析构 需要声明也需要实现//有了纯虚析构之后,这个类也属于抽象类,无法实例化对象virtual ~Animal() = 0;//纯虚函数virtual void speak() = 0;
};Animal::Animal()
{cout << "Animal析构函数调用" << endl;
}
class Cat :public Animal
{
public:Cat(string name){cout << "Cat构造函数调用" << endl;m_name = new string(name);}virtual void speak(){cout <<*m_name<< "小猫想说话" << endl;}~Cat(){if (m_name != NULL){cout << "Cat析构函数调用" << endl;delete m_name;m_name = NULL;}}string *m_name;
};
void test1()
{Animal *animal = new Cat("Tom");animal->speak();//父类指针在析构时候 不会调用子类析构函数,导致子类如果有堆区属性,导致内存泄漏delete animal;
}
void test2()
{}
int main()
{test1();test2();system("pause");return 0;
}

 

 

 

这篇关于虚析构和纯虚析构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/304242

相关文章

虚析构函数与析构函数的区别

先看下面代码: class A { public: A() { printf("A()"); } virtual ~A() { testOutput(); printf("~A()"); } virtual testOutput() { printf("testA"); } }; class B: public A { public: B() { printf("B()"); } virt

(P35)虚函数与多态:纯虚函数 ,抽象类 ,多态 ,虚析构函数

文章目录 1.纯虚函数2.抽象类3.多态4.虚析构函数 1.纯虚函数 虚函数的特征: 基类之指针指向派生类的对象,调用的是派生类的虚函数,若不是虚函数,则调用的还是基类的函数,是依据类型来决定的; 这就可以使得我们可以以一致的观点来看待不同的派生类对象,而不需要关注派生类对虚函数是如何实现的; 该过程是动态绑定的,也就是在运行时刻才确定虚函数实际的入口地址; 虚函数是实现多

C++ 虚析构函数与析构函数的区别

先看下面代码: class Parent{public:Parent();~Parent();};Parent::Parent(){cout << "基类构造...." << endl << endl;}Parent::~Parent(){cout << "基类析构..." << endl << endl;}class Child :public Parent{public:

C++|多态性与虚函数(2)|虚析构函数|重载函数|纯虚函数|抽象类

前言 看这篇之前,可以先看多态性与虚函数(1)⬇️ C++|多态性与虚函数(1)功能绑定|向上转换类型|虚函数-CSDN博客https://blog.csdn.net/weixin_74197067/article/details/138861418?spm=1001.2014.3001.5501这篇文章会接着上一篇来记录 虚析构函数 构造函数不能是虚函数,但析构函数可以是虚函数,同样的在

c++只在基类中用虚析构函数的原因

C++的多态性是通过虚函数来实现的,虚函数的出现使得动态链接成为可能。 基于构造函数的特点,不能将构造函数定义为虚函数,但可以将析构函数定义为虚函数。 一般情况:当派生类的对象从内存中撤销时,会先调用派生类的析构函数,然后自动调用基类的析构函数,如此看来析构函数也没有必要定义为虚函数。 但 如考虑如下这种情况,如果使用基类指针指向派生类的对象,而这个派生类对象恰好是用new运算创建的,

读书笔记 effective c++ Item 7 在多态基类中将析构函数声明为虚析构函数

1. 继承体系中关于对象释放遇到的问题描述 1.1 手动释放 关于时间记录有很多种方法,因此为不同的计时方法创建一个TimeKeeper基类和一些派生类就再合理不过了: 1 class TimeKeeper {2 3 public:4 5 TimeKeeper();6 7 ~TimeKeeper();8 9 ...10 11 };12 13 class AtomicClock: p

虚析构函数和protected析构函数

一、虚析构函数 类型需要虚析构函数的另外一个特征 是该类型具有指针成员或引用成员。如果有指针成员和引用成员,则该类型通常需要实现析构函数以及拷贝操作。   通常,一个实现了析构函数的类型同时也需要实现拷贝构造函数与拷贝复制函数。   作为一个经验法则: 如果你有一个带有虚函数功能的类,则它需要一个虚析构函数,原因如下:   1. 如果一个类有虚函数功能,它经常作为一个基类使用。

C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序

C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序 标签: 数据结构 数组 链表 快速排序 归并排序 抽象类 虚继承 by 小威威 1.介绍 本篇博文将通过课后作业的(15 C++ Homework) D&A 5 Collection with Inheritance来讲解一些重要的排序与零散的知识。而且,本人以科学严谨的态度,对抽象类中析构函数的调用情况进行了分类讨论并一

构造函数与虚析构函数

1. 构造函数          因为在派生类中构造函数是不能继承的,也没有重定义的必要。在构造函数中调用虚函数将破坏动态绑定逻辑。下面的例子说明了这样动态绑定逻辑。 例:          #include<iostream.h>   class base    {       protected:       int x;       publi

C++类和对象-多态->多态的基本语法、多态的原理剖析、纯虚函数和抽象类、虚析构和纯虚析构

#include<iostream> using namespace std; //多态 //动物类 class Animal { public:     //Speak函数就是虚函数     //函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。     virtual void speak()     {         cout << "动物在说