【C++ | 抽象类】纯虚函数 和 抽象基类,为什么需要抽象基类

2024-07-21 1454阅读

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀

🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭

🤣本文内容🤣:🍭介绍 抽象基类 和 纯虚函数 🍭

😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

⏰发布时间⏰:

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、纯虚函数
  • 🎄三、抽象基类
  • 🎄四、为什么需要抽象类
  • 🎄五、总结

    【C++ | 抽象类】纯虚函数 和 抽象基类,为什么需要抽象基类

    【C++ | 抽象类】纯虚函数 和 抽象基类,为什么需要抽象基类

    🎄一、概述

    在生活中,有时会使用到比较抽象的词语,例如下面这个场景:

    A:帮我把那个“东西”拿过来。
    B:你是说,桌面的那个杯子吗?
    A:是的。
    

    这个场景中的“东西”就属于抽象的词语。而在C++编程中,有时也会出现这样抽象的语法。例如,我们可能会定义一个“动物”基类,但代码中不会定义一个“动物”的实例,而是将“动物”基类派生出“狗”、“猫”等派生类,再使用派生类去实例化。

    本文主要介绍下面几个内容:

    1、什么是纯虚函数?

    2、什么是抽象基类?

    3、为什么需要抽象基类?


    【C++ | 抽象类】纯虚函数 和 抽象基类,为什么需要抽象基类

    🎄二、纯虚函数

    上篇文章:【C++ | 虚函数】虚函数详解 及 例子代码演示(包含虚函数使用、动态绑定、虚函数表、虚表指针),我们详细地介绍了虚函数以及C++怎样实现虚函数的,但有一个也是很重要的知识点没在上篇文章介绍,这个知识点就是 纯虚函数。

    纯虚函数:本质上也是虚函数,在虚函数的函数原型的分号前加上=0就可以将一个虚函数说明为纯虚函数。

    下面代码声明了一个虚函数 eat:

    virtual void eat() =0;
    

    纯虚函数的特点:

    1、纯虚函数声明就是在函数原型分号前加=0;

    2、纯虚函数允许只有声明,没有定义(实现);

    3、纯虚函数可以没有定义,也可以有定义,但纯虚函数的定义只能在类外。

    4、只有虚函数可以加=0,非虚函数加=0会编译报错:error: initializer specified for non-virtual method

    🌰举例子

    // g++ 24_pure_virtual.cpp
    #include 
    using namespace std;
    class CAnimal{
    public:
    	// 1、纯虚函数声明就是在函数原型分号前加`=0`
    	// 2、纯虚函数允许只有声明,没有定义(实现);
    	virtual void eat() =0;	
    	virtual void run() =0;
    };
    // 3、纯虚函数的定义只能在类外。
    inline void CAnimal::run()
    {
    	cout 
    	
    }
    
    public:
    	virtual void eat() =0;	// 纯虚函数,本类是抽象基类
    	virtual void run() =0;
    };
    class CCat : public CAnimal{
    public:
    	// 没有重写基类的所有纯虚函数,本类是抽象类
    	virtual void eat(){
    		cout 
    public:
    	// 重写基类的所有纯虚函数,本类不是抽象类
    	virtual void eat(){
    		cout 
    		cout 
    	cout 
    	//CAnimal animal;	// 报错:error: cannot declare variable ‘animal’ to be of abstract type ‘CAnimal’
    	//CCat cat;	// 报错:error: cannot declare variable ‘cat’ to be of abstract type ‘CCat’
    	CDog dog;
    	CAnimal *pAnimal = &dog;
    	pAnimal-run();
    	pAnimal-CAnimal::run(); // 指定调用基类的run
    }
    
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]