• C++纯虚函数和抽象类


    在多态中,通常父类中的虚函数是没有意义的,因为多态就是用父类类型的变量调用子类的方法,详细的可以看这个C++多态的使用 

    因此可以把虚函数变成纯虚函数,当类中有了纯虚函数,这个类也称为抽象类

    纯虚函数语法:virtual 返回值类型 函数名(参数列表)=0;

    抽象类的特点:

    1、无法实例化对象

    2、子类必须重写父类的纯虚函数,否则也属于抽象类

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

    解决办法:把父类的析构函数改成虚析构或者纯虚析构

    虚析构和纯虚析构共性:

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

    2、都需要有具体的函数实现

    虚析构和纯虚析构区别:

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

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5 + 5;
    class Animal
    {
    public:
        Animal()
        {
            cout << "Animal的构造函数" << endl;
        }
        virtual void speak() = 0;
        // virtual ~Animal() = 0;
        virtual ~Animal(){
            cout << "Animal虚函数析构" << endl;
        }
    };
    // Animal::~Animal()
    // {
    //     cout << "Animal纯虚函数析构" << endl;
    // }
    class cat : public Animal
    {
    public:
        //如果不采用虚析构,那么name指针的值就无法释放,就会产生内存泄漏问题
        string *name;
        cat(string name)
        {
            cout << "cat的构造函数" << endl;
            this->name = new string(name);
        }
        virtual void speak() //这里的virtual可写可不写
        {
            printf("cat is Speaking
    ");
        }
        ~cat()
        {
            cout << "are小猫姓名为:" << name << endl;
            delete name;
            name = NULL;
        }
    };
    void test()
    {
        Animal *a = new cat("Tom");
        a->speak();
        delete a;
        a=NULL;
    }
    int main()
    {
        test();
        return 0;
    }
  • 相关阅读:
    概念
    Jquery和Aspnet前台控件及后台代码交互
    未能找到引用的组件“Microsoft.Office.Core
    C#操作Excel,调用ApplicationClass.Quit()关闭Excel时,发生异常:Microsoft Office Word 遇到问题需要关闭
    Javasrcipt捕获按键
    使用Interop.Excel生成Excel
    Javasrcipt时间相关函数
    (转)各种纹理贴图技术
    (转)立体纹理
    (转)地形碰撞高度计算
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/14725592.html
Copyright © 2020-2023  润新知