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

 更新时间:2022年06月13日 09:03:25   作者: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++纯虚函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vscode使用cmake时将命令行参数传递给调试目标的方法

    vscode使用cmake时将命令行参数传递给调试目标的方法

    这篇文章主要介绍了vscode使用cmake时将命令行参数传递给调试目标,下面介绍了一个示例,将参数first_arg, second-arg和third arg传递给程序(此处需要注意,third arg中间虽然存在空格,但是仍然被视作一个参数),需要的朋友参考下吧
    2024-03-03
  • C语言 makefile学习及实现实例

    C语言 makefile学习及实现实例

    这篇文章主要介绍了C语言 makefile学习及实现实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • Qt学习教程之表格控件蚂蚁线详解

    Qt学习教程之表格控件蚂蚁线详解

    如果有用过PS的选区工具应该就会知道蚂蚁线是什么东西了,就是用来表示选区的一种虚线,关键还是要动态的!下面这篇文章主要给大家介绍了关于Qt学习教程之表格控件蚂蚁线的相关资料,需要的朋友可以参考下
    2018-07-07
  • C++中的聚合类定义与用法分析

    C++中的聚合类定义与用法分析

    这篇文章主要介绍了C++中的聚合类定义与用法,结合实例形式分析了C++中聚合类的简单定义、使用方法与相关注意事项,需要的朋友可以参考下
    2017-08-08
  • C++实现一个简单的线程池的示例代码

    C++实现一个简单的线程池的示例代码

    本文主要介绍了C++实现一个简单的线程池的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 详解C++编程中表达式的语义与计算顺序

    详解C++编程中表达式的语义与计算顺序

    这篇文章主要介绍了C++编程中表达式的语义与计算顺序,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • C++ LeetCode1780判断数字是否可以表示成三的幂的和

    C++ LeetCode1780判断数字是否可以表示成三的幂的和

    这篇文章主要为大家介绍了C++ LeetCode1780判断数字是否可以表示成三的幂的和题解示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 手动添加bits/stdc++.h到vs2017的详细步骤

    手动添加bits/stdc++.h到vs2017的详细步骤

    这篇文章主要介绍了手动添加bits/stdc++.h到vs2017的详细步骤,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • C++ vector在多线程操作中出现内存错误问题及解决

    C++ vector在多线程操作中出现内存错误问题及解决

    这篇文章主要介绍了C++ vector在多线程操作中出现内存错误问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言实现抢红包算法

    C语言实现抢红包算法

    这篇文章主要为大家详细介绍了C语言抢红包算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09

最新评论