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\n");
    }
    ~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;
}

 

posted @ 2021-05-02 13:18  kongbursi  阅读(113)  评论(0编辑  收藏  举报