• 【C++】多态 ⑪ ( 纯虚函数和抽象类 | 纯虚函数语法 | 抽象类和实现 | 代码示例 )







    一、纯虚函数和抽象类




    1、纯虚函数


    纯虚函数 : 在 C++ 语言中 , " 纯虚函数 " 是 特殊类型的 虚函数 , " 纯虚函数 " 在 父类 中 声明 , 但是没有实现 ;

    抽象类 : " 纯虚函数 " 的 作用 是将 父类 变为 " 抽象类 " , 该类不能被实例化 , 不能创建类的实例对象 ;

    继承抽象类必须实现纯虚函数 : 任何从 " 抽象类 " 派生出来的 子类 都必须提供 " 纯虚函数 " 的实现 ;


    父类 中的 " 纯虚函数 " 为 其若干子类 提供了一个 公共界面 , 用于 接口的 封装 / 设计 , 软件的 模块划分 ;


    2、纯虚函数语法


    纯虚函数语法 :

    • 函数前 使用 virtual 关键字修饰 ;
    • 函数声明后在 括号后面为函数 赋值 0 ;
    // 纯虚函数定义
    virtual 返回值类型 函数名(参数列表) = 0;
    
    • 1
    • 2

    纯虚函数 定义 代码示例如下 :

    	// 纯虚函数  
        virtual void pureVirtualFunction() = 0;
    
    • 1
    • 2

    3、抽象类和实现


    " 抽象类 " 就是在类中定义了一个 " 纯虚函数 " ,

    " 抽象类 " 至少包含一个纯虚函数 , 抽象类 不能 创建 实例对象 , 只能作为其它类的 父类 ;

    " 纯虚函数 " 是一种在 父类 中 声明但没有实现 的虚函数 , 其目的是使 父类 成为抽象类 ;

    任何从抽象类派生出来的子类都必须提供 纯虚函数 的实现 ;


    " 抽象类 " 代码示例 :

    // 定义了纯虚函数的类就是抽象类
    class AbstractClass {  
    public:  
    	// 纯虚函数  
        virtual void pureVirtualFunction() = 0;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上述 AbstractClass 类是抽象类 , 该类不能创建实例对象 ;

    • 否则会报错 error C2259: “AbstractClass”: 无法实例化抽象类 ;

    子类 继承 AbstractClass 类 , 必须 实现 virtual void pureVirtualFunction() 函数 ;


    下面代码中 , DerivedClass 派生类 , 继承 AbstractClass 抽象类 , 实现了 纯虚函数 pureVirtualFunction 函数 ;

    实现的 纯虚函数 可以不使用 virtual 修饰 , 在 函数声明 最后添加 override 关键字 ;

    // 派生类继承抽象类
    class DerivedClass : public AbstractClass {  
    public:  
    	// 实现纯虚函数
        void pureVirtualFunction() override {  
             // 函数体 
        }  
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8




    二、完整代码示例



    抽象类 的 核心作用 就是 使用 抽象类类型指针 指向 子类对象 ,

    使用 抽象类 指针 调用 纯虚函数 , 由于 父类 的 纯虚函数没有实现 , 实际调用的 是 子类对象的 函数 ,

    该调用 发生了 多态 ;


    代码示例 :

    #include "iostream"
    using namespace std;
    
    // 定义了纯虚函数的类就是抽象类
    class AbstractClass {
    public:
    	// 纯虚函数  
    	virtual void pureVirtualFunction() = 0;
    };
    
    // 派生类继承抽象类
    class DerivedClass : public AbstractClass {
    public:
    	// 实现纯虚函数
    	void pureVirtualFunction() override {
    		// 函数体 
    		cout << "调用 DerivedClass 的 pureVirtualFunction 函数" << endl;
    	}
    };
    
    int main() {
    
    	// 抽象类不能实例化
    	// error C2259: “AbstractClass”: 无法实例化抽象类
    	//AbstractClass a;
    
    	// 使用抽象类指针 指向 子类对象
    	AbstractClass* p = new DerivedClass();
    
    	// 使用抽象类指针 调用 子类对象 实现的 纯虚函数
    	// 运用了 多态 原理
    	p->pureVirtualFunction();
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    执行结果 :

    调用 DerivedClass 的 pureVirtualFunction 函数
    Press any key to continue . . .
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    十六、保存和加载自己所搭建的网络模型
    kafka简介
    VR农学虚拟仿真情景实训教学演示
    win10环境下搭建QT+opencv
    虹科干货 | 如何选择合适水下应用的集成电缆传感器?
    web期末作业设计网页 HTML+CSS+JavaScript仿王者荣耀游戏新闻咨询(web前端网页制作课作业)
    网络服务性能优化:Wrktcp与Perf工具详解
    STM32 GPIO LED和蜂鸣器实现【第四天】
    vscode使用插件KoroFileHeader添加注释
    k8s学习
  • 原文地址:https://blog.csdn.net/han1202012/article/details/134178482