zoukankan      html  css  js  c++  java
  • c++之虚析构和純虚析构

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

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

    虚析构函数和純虚函数的共性:

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

    虚析构和析构函数的区别:

    • 如果是純虚析构,该类属于抽象类,无法实例化对象。
    #include<iostream>
    using namespace std;
    
    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:
        string name;
        Cat(string name) {
            cout << "Cat的Cat(string name)构造函数调用" << endl;
            this->name = name;
        }
        ~Cat() {
            cout << "Cat的析构函数调用" << endl;
            this->name = name;
        }
        void speak() {
            cout << "喵喵喵" << endl;
        }
    };
    class Dog :public Animal {
    public:
        string name;
        Dog(string name) {
            cout << "Dog的Dog(string name)构造函数调用" << endl;
            this->name = name;
        }
        ~Dog() {
            cout << "Dog的析构函数调用" << endl;
            this->name = name;
        }
        void speak() {
            cout << "汪汪汪" << endl;
        }
    };
    
    //这里必须传入地址
    //父类的引用指向子类的对象,实现动态多态
    void doSpeak()
    {
        Animal* animal = new Cat("tom");
        //父类指针在析构时,不会调用子类中的析构函数。导致了子类中有堆区属性,出现内存泄漏;
        //解决方法,将父类析构函数声明为virtual
        animal->speak();
        delete animal;
        cout << "-----------------------" << endl;
        animal = new Dog("jack");
        animal->speak();
        delete animal;
    }
    
    int main() {
        doSpeak();
        system("pause");
        return 0;
    }

    输出:

  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12102379.html
Copyright © 2011-2022 走看看