C++:纯虚函数与抽象类

简介:

5.4.3 纯虚函数和抽象类

纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但是要求在派生类中根据需要对它进行定义,或仍然说明为纯虚函数。


声明纯虚函数的一般格式是:
virtual 函数类型 函数名(参数表)=0;

纯虚函数的作用是:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行重新定义。纯虚函数没有函数体,它最后面“=0 ”并不表示函数的返回值是0,它只是形式上的作用,告诉编译系统这是纯虚函数。纯虚函数不具有函数的功能,不能被调用。

//应用举例

复制代码
#include<iostream>
using namespace std;
#define PI 3.14 
class Circle{                   //基类(抽象类) 
  public: 
   void setradius(double r)
   {
    radius = r;
   } 
   virtual void show()=0;        //在基类里定义纯虚函数 
  protected:
   double radius;  
};
class Area:public Circle{
  public:
    void show()                 //在派生类Area中重新定义虚函数函数show 
    {
     cout<<"圆的面积是:"<<PI*radius*radius<<endl;
    }
};
class Perimeter:public Circle{
  public:
    void show()                 //在派生类Perimeter中重新定义虚函数函数show 
    {
     cout<<"圆的周长是:"<<2*PI*radius<<endl;
    }
};
int main()
{
 Circle *ptr;           //定义(抽象类)基类circle对象指针ptr
 Area a;               //定义Area对象a
 a.setradius(10);
 ptr=&a;
 ptr->show(); 
 Perimeter p;          //定义Perimeter对象p
 p.setradius(10);
 ptr=&p;
 ptr->show();
 return 0; 
}
复制代码

程序运行结果:
圆的面积是:314
圆的周长是:62.8

在以上例子中,Circle是一个基类,它表示一个圆。从它可以派生出面积类Area和周长类Perimeter。显然,基类中定义的show函数是没有任何意义的,它只是用来提供派生类使用的公共接口,所以在程序中将其定义为纯虚函数,但在派生类中,则根据程序的需要,具体地重新定义纯虚函数。如果一个类至少有一个纯虚函数,那么就称为这个类为抽象类。因此,上述程序中定义的类Circle就是一个抽象类。对于抽象类的使用有以下几点规定:

(1)由于抽象类中至少包含有一个没有定义功能的纯虚函数,因此抽象类只能用其他类的基类,不能建立抽象类的对象。


(2)抽象类不能用作参数类型、函数返回类型或显式转换的类型。但是可以声明指向抽象类的的指针变量,此指针可以指向它的派生类,进而实现多态性。


(3)如果在抽象类的派生类中没有重新说明纯虚函数,则该函数在派生类中仍然为纯虚函数,而这个派生类仍然还是一个派生类。

本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4912682.html ,如需转载请自行联系原作者
相关文章
|
8月前
|
弹性计算 运维 安全
毅硕HPC | Pritunl + ECS + Frp 搭建远程办公VPN
本教程将介绍一种 “鱼与熊掌兼得” 的创新方案:核心VPN服务(Pritunl)部署在您本地的强大工作站上,通过轻量级的FRP内网穿透工具,借助阿里云ECS提供的稳定公网入口,安全地将其服务能力发布到互联网。 这样,远程员工只需连接到一个统一的云上地址,即可直接接入您办公室或实验室的本地网络,访问其中的设备,实现真正意义上的“远程局域网”体验。
1066 1
毅硕HPC | Pritunl + ECS + Frp 搭建远程办公VPN
|
1月前
|
人工智能 API iOS开发
零门槛配置指南:借助DeepCodex实现Codex无缝对接DeepSeek大模型,让AI编程助手自由切换模型
在当下的编程领域,AI编程助手已经成为开发者提升编码效率、排查代码漏洞、学习新语法的核心工具。Codex桌面端凭借出色的代码理解、生成与调试能力,收获了大量开发者的青睐。不过不少用户在使用过程中都会产生同一个想法:将Codex默认的底层模型替换为日常使用更顺手的DeepSeek模型。但二者采用了不同的接口协议,普通用户想要手动完成协议适配、接口配置、模型切换等一系列操作,不仅步骤繁琐,还极易因参数配置错误导致调用失败,对于编程新手而言更是难以独立完成。为了解决这一痛点,DeepCodex应运而生,它通过在本地搭建轻量级桥接服务,自动完成两大模型之间的协议转换,同时提供可视化命令行菜单,实现一键
1000 0
|
Windows
windows查看端口占用情况
windows查看端口占用情况
1216 9
|
编解码 监控 Linux
嵌入式Linux MIPI接口LCD调试-关于DRM显示与应用调试的干货浓缩
嵌入式Linux MIPI接口LCD调试-关于DRM显示与应用调试的干货浓缩
2444 0
|
编解码 缓存 Linux
Linux ALSA音频驱动之一:框架概述
Linux ALSA音频驱动之一:框架概述
Linux ALSA音频驱动之一:框架概述
|
Ubuntu 编译器
在Ubuntu中设置QT Creator的交叉编译环境。
在进行交叉编译设置时,请确保遵循你的目标硬件平台和软件的具体指南。以上步骤给出的是一个概括的指南,具体步骤可能因你的特定需求而有所不同。务必参照相关硬件和软件的官方文档进行操作,以获得具体的、针对性的指导。
983 0
|
移动开发 网络协议 数据格式
【VOFA+速成】半小时入门VOFA+简明教程之基础认识(一)
【VOFA+速成】半小时入门VOFA+简明教程(一)
7346 1
|
缓存 Linux C++
Linux 系统应用编程——标准I/O
标准I/O的由来         标准I/O指的是ANSI C 中定义的用于I/O操作的一系列函数。         只要操作系统安装了C库,标准I/O函数就可以调用。换句话说,如果程序中使用的是标准I/O函数,那么源代码不需要任何修改就可以在其他操作系统下编译运行,具有更好的可移植性。
1448 0

热门文章

最新文章