• 虚析构和纯虚析构


    虚析构和纯虚析构的共性

    1.可以解决父类指针释放子类对象

    2.都需要具体的函数实现

    虚析构和纯虚析构的区别

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

    虚析构语法 virtual ~类名(){}

    纯虚析构 virtual ~类名() = 0

    纯虚析构的类外实现 类名::~类名(){}

     1 #include<bits/stdc++.h>
     2 #include<iostream>
     3 using namespace std;
     4 
     5 class Animal
     6 {
     7 public:
     8     Animal()
     9     {
    10         cout << "Animal构造函数调用" << endl;
    11     }
    12     virtual void speak() = 0;
    13 
    14     virtual~Animal() = 0;
    15 };
    16 
    17 Animal::~Animal()
    18 {
    19     cout << "Animal 纯虚析构函数调用" << endl;
    20 }
    21 
    22 class Cat:public Animal
    23 {
    24 public:
    25     Cat(string name)
    26     {
    27         cout << "Cat 构造函数调用" << endl;
    28         m_Name = new string(name);
    29     }
    30 
    31     virtual void speak()
    32     {
    33         cout << *m_Name << "猫在说活" << endl;
    34     }
    35 
    36     ~Cat()
    37     {
    38         cout << "猫析构函数调用" << endl;
    39         if(this->m_Name != NULL)
    40         {
    41             delete m_Name;
    42             m_Name = NULL;
    43         }
    44 
    45     }
    46 public:
    47     string *m_Name;
    48 };
    49 
    50 void test()
    51 {
    52     Animal *animal = new Cat("Tom");
    53     animal->speak();
    54     //通过父类指针去释放,会导致子类对象清理不干净,造成内存泄露
    55     //解决方法是给父类增加虚析构函数
    56     //虚析构函数是用来解决通过父类指针释放子类对象
    57     delete animal;
    58 }
    59 
    60 int main()
    61 {
    62     test();
    63     return 0;
    64 }
  • 相关阅读:
    SPF(poj 1523) 割点入门
    从一个例子讲解拷贝构造函数与return
    还是引用
    引用的实质
    const
    三目运算符
    关于C语言链表的学习
    CS2013调试DLL
    fread与fwrite的自我理解
    可见字符与不可见字符
  • 原文地址:https://www.cnblogs.com/mch5201314/p/11603756.html
Copyright © 2020-2023  润新知