C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++纯虚函数

C++中纯虚函数的实例详解

作者:Y.你壕

纯虚函数就是一个在基类中的虚函数,差别只是在一般的虚函数声明的后面加了“=0”,下面这篇文章主要给大家介绍了关于C++中纯虚函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

虚函数和纯虚函数

之前学过虚函数,语法:virtual 返回值类型 函数名(参数列表),然后这个类也就变成的虚基类,然后子类重写父类的虚函数。

纯虚函数,语法:virtual 返回值类型 函数名(参数列表)=0,当类中有了纯虚函数,这个类也称为抽象类。抽象类特点:无法实例化对象,子类必须重写抽象类中的纯虚函数,否则也属于抽象类。

class Base
{
public:
    virtual void Examp() = 0;//纯虚函数
    ~Base()
    {
        cout << "父类的析构函数" << endl;
    }
};
 
class Son:public Base
{
public:
    void Examp()
    {
        cout << "重写了父类的纯虚函数" << endl;
    }
    
    ~Son()
    {
        cout << "子类的析构函数" << endl;
    }
};
 
int main()
{
    Son p1;
    p1.Examp();
    system("pause");
}

上面是最简单的纯虚函数代码,子类必须得重写重写抽象类中的纯虚函数,不然不能实例化对象。

接下来我们如果利用子类对象开辟堆区,那么会带来父类指针释放子类对象时不干净的问题,即子类的析构函数不能够正常的被调用,会带来内存泄漏的问题:

int main()
{
    Son *p1=new Son;//子类对象开辟堆区
    p1->Examp();
    delete p1;//释放堆区,自动调用析构函数
    system("pause");
}

为了解决这个问题,可以利用虚析构和纯虚析构,也很简单,直接在父类的析构函数前面加上virtual关键字就成为了虚析构函数,这个类也会成为抽象类。

class Base
{
public:
    virtual void Examp() = 0;//纯虚函数
    virtual ~Base()//虚析构
    {
        cout << "父类的析构函数" << endl;
    }
};

或者是利用纯虚析构

class Base
{
public:
    virtual void Examp() = 0;//纯虚函数
 
    virtual ~Base() = 0;//类内声明
};
 
Base::~Base()//类外实现
{
        cout << "父类的析构函数" << endl;
}

附:纯虚函数的应用

包含纯虚函数的类叫抽象类,它不能生成对象,用户不能创建类的实例,只能创建派生类的实例。

注明:纯虚函数必须在继承类中重新声明函数(去掉后面的0,否则该派生类也不能实例化)。就是基类告诉子类,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它。”

代码实现:

include<stdio.h>
#include<iostream>
using namespace std;
class Base
{
public:
        virtual void func()=0;  //在基类中声明纯虚函数
};
class Derived:public Base
{
public:
        void func()         //在子类中重写纯虚函数
        {
                cout<<"哈哈"<<endl;
        }
};
int main()
{
        Base *b=new Derived();      //基类的指针调用子类重写的纯虚函数
        b->func();
        return 0;
}

总结

虚析构或纯虚析构就是用来解决通过父类指针释放子类对象

如果子类中没有堆区数据,可以不写为虚析构或纯虚析构

到此这篇关于C++中纯虚函数的文章就介绍到这了,更多相关C++纯虚函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文