栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

3.1 C++高级编程

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

3.1 C++高级编程

在前面的文章中,我们引入了虚函数。所谓虚函数,就是在声明函数成员时,在函数名的前面前面加上一个virtual。

纯虚函数和抽象类

现在考虑这样一种情况,假设要做一个“各个国家的人”的调查,那么这些人都会有一些统一的行为,比如:饮食、穿衣、开车......

那么就可以创建一个基类Human,然后从这个基类派生出Englishman,Chinese等类。

由于不存在没有国家的人,所以实际上不会使用Human类来定义一个人。

那么,就不需要在Human类中定义eating,wearing,driving函数,反正派生类Englishman,Chinese类中肯定会有相关的函数定义。

将Human类中的eating,wearing,driving函数,定义为纯虚函数。

当一个成员函数,被定义为virtual,同时又=0,那么这个成员函数就是纯虚函数。

含有纯虚函数的类,就是抽象类。

抽象类是为了给它的派生类定义框架,或者称为给使用这些类的应用程序定义好接口。

需要注意的是,抽象类不能用来实例化对象。

在main函数中创建一个Human类对象,然后编译。

可以看到有报错,原因为不能创建抽象类对象,即抽象类不能用来实例化对象。

修改Human的派生类Englishman和Chinese,在派生类中实现具体的eating,wearing,driving函数。

 

 

在main函数中创建两个派生类的对象,由于派生类已经覆写了所有基类的纯虚函数,所以此时编译可以成功。

如果在派生类中,缺少基类的纯虚函数的定义,那么还可以编译成功吗?

将 Chinese 中的 driving 函数定义删除,再次编译。

此时会报和之前创建 Human 类对象相同的调试信息。

这是因为,由于在派生类中没有定义 driving 函数,那么 driving 函数就还是一个纯虚函数,这个派生类也就还是抽象类,而抽象类不能实例化对象。

可以定义一个Chinese类的派生类Guangximan,在Guangximan类中定义driving函数。

此时可以创建Guangximan类的对象。

此时编译可以成功。

总结

纯虚函数:

  1. virtual 函数声明时,后面加上 “=0”,例如virtual void eating(void) = 0;
  2. 纯虚函数不需要定义,只需声明;

抽象类:含有纯虚函数的类。

  1. 抽象类不能实例化对象;
  2. 若子类没有覆写完所有的纯虚函数,则子类还是抽象类;

抽象类的作用:向下定义好框架,向上提供统一的接口。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1038538.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号