c++ - 抽象类 和 使用多态当中一些注意事项

这篇具有很好参考价值的文章主要介绍了c++ - 抽象类 和 使用多态当中一些注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 抽象类

纯虚函数 

 在虚函数的后面写上 =0 ,则这个函数为纯虚函数。

class A
{
public:
	virtual void func() = 0;
};

纯虚函数不需要写函数的定义,他有类似声明一样的结构。

 抽象类概念

 我们把具有纯虚函数的类,叫做抽象类。

所谓抽象就是,不符合常理的,偶然的,和平常的类不太一样的类。抽象一般是我们人自己想出来的形象,在现实世界当中没有对应的实体,同样的抽象类在现实世界当中没有对应的实体。

 所以,以上描述就引出了抽象类最大的特点:抽象类不能实例化对象

c++ - 抽象类 和 使用多态当中一些注意事项,c++,开发语言

 而且,如果某一个子类的父亲是一个抽象类,那么这个子类也是不能实例化对象的,因为子类继承了父类当中的纯虚函数。那么子类就包含了纯虚函数,主要是包含纯虚函数的类就是抽象类。

c++ - 抽象类 和 使用多态当中一些注意事项,c++,开发语言

 那么,怎样才能让上述的 B 子类能够 实例化对象呢?我们只需要在 B 当中重写一些 A 当中的纯虚函数就可以 让 子类(B类)实例化对象了

// 这是一个抽象类
class A
{
public:
	virtual void func() = 0;
};

// 重写之后就可以 实例化B 对象了
class B : public A
{
public:
	virtual void func()
	{
		cout << "B::func()" << endl;
	}
};

int main()
{
	B b;

	return 0;
}

使用抽象类作为父类,实现出来的子类的多态使用方式,是和普通的一样的。只不过在 父类 当中不在有虚函数表,因为 父类是抽象类,抽象类不能实例化对象,也就不存在虚函数表了。

抽象类当中的多态 和 普通父类的多态在这里多做了一件什么事情呢?文章来源地址https://www.toymoban.com/news/detail-708810.html

  •  我们知道,父类当中的虚函数,如果子类不进行重写,那么这个虚函数是没有任何作用的;而在抽象类当中,就强制其子类要对抽象类当中的纯虚函数进行重写。
  • 而且这里是 间接性的 强制重写,和之前我们提到的 override 检车重写是不一样的。而且 override 是修饰在派生类当中的,抽象类强制重写,语法是建立在父类当中的。

 多态当中需要注意的点

  •  inline(内联)函数能不能是虚函数?可以,但是,当一个 inline函数 称为虚函数之后,这个函数就不在是inline函数了,因为虚函数需要把地址放到虚表当中,而且内联函数是没有地址的。
  • 静态成员函数不能是 虚函数。如果 把 static 和 virtual 放在一起修饰的话,编译器会直接报错。这是因为,静态成员函数没有 this 指针,静态成员函数是使用 类型::成员函数名 的方式调用的,这样的方式是不能访问到对象当中的虚表的,所以静态成员函数是无法放进虚表的;还有个解释是,静态成员函数是属于类的,不是属于对象的,而只有实例化对象出来之后才能构造处虚表。
  •  构造函数不能是虚函数,如果在构造函数前加 virtual 修饰,就会报错。虚函数表是在编译的时候生成的,而指向虚表的指针是在 构造函数初始化列表的最端初始化的,初始化之后才会指向虚函表, 初始化之前都是随机值。那么,如果构造函数成为了虚函数,而虚函数的作用就是多态,那么在构造函数调用前,虚函数表指针都没有初始化,怎么去找这个构造函数的虚函数呢?所以,构造函数是不能成为虚函数的。
  • 析构函数可以是虚函数。而且,我们最好把父类当中的析构函数定义为虚函数,让子类进行重写。比如这个例子(A是父类,B是子类):A* p = new B;    delete p; 此时,因为 p 指针的类型是 父类A的类型,所以,在调用 detele 的时候,所调用的析构函数就会是 父类 A 的析构函数,那么就会出现问题,但是如果 重写之后,就会调用子类的析构函数。
  • 一个类当中调用普通函数快还是调用虚函数快?如果是普通对象,一样快;如果是指针函数或引用函数,普通函数快。因为此时构成多态。但是,其实两者之间调用时间,差别不大。

到了这里,关于c++ - 抽象类 和 使用多态当中一些注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch 一些异常报错、注意事项(1)

    系统支持通过参数(op_type=create)强制执行创建索引操作。只有当系统中不存在此文档的时候才会创建成功。如果不指定此操作类型,如果存在此文档则会进行更新操作。 bulk 默认op_type 是index 当创建文档的时候,如果不指定id,系统则会默认创建id。自动生成的id是一个不会重

    2023年04月08日
    浏览(20)
  • 手机怎么剪视频?分享一些剪辑工具和注意事项

    视频剪辑是一种将多个视频片段进行剪切、合并和编辑的技术,它可以帮助我们制作出精彩的视频作品。如今,随着智能手机的普及,我们可以随时随地使用手机进行视频剪辑。本文将为大家介绍一些手机剪辑工具和注意事项,帮助大家更好地进行视频剪辑。   首先,我们来

    2024年02月10日
    浏览(36)
  • Spring Data Elasticsearch 一些异常报错、注意事项(1)

    记录一:批量更新数据saveAll 引入maven依赖  saveAll批量新增,如果数据存在则会更新数据 记录二:批量更新数据Script脚本更新字段 参考:Script query | Elasticsearch Guide [8.5] | Elastic 记录三:空字段查询处理 如果查询字段createTime在ES数据中不存在,直接用.must(QueryBuilders.rangeQuery(

    2024年02月11日
    浏览(34)
  • Unity发布抖音小游戏的一些注意事项

    使用 webgl模式 发布抖音小游戏的一些注意事项 1.打包 使用webgl模式打包抖音小游戏,会因为找不到aapt工具导致打包失败 提示: aapt检查失败: sdk/build-tools/版本号。 解决方法:再unity hub里添加Android Build Support  2.黑屏问题 相机的HDR设为off 3.Text字体不见的问题 不能用unity自带的

    2024年02月11日
    浏览(30)
  • git常规操作流程(纯命令行操作)和一些注意事项

    当你在单位拿到了git仓库,并利用公司给你的OA账号和邮箱完成了你的git基础配置,下面就是使用命令行的无错固定操作流程 如果你很着急,你可以直接跳到最后的 总结部分 1.从仓库克隆代码到本地 这里的[codeUrl]就是你仓库的地址,当你在仓库点击图中绿色位置时,剪贴板复制的就

    2024年02月03日
    浏览(30)
  • 关于 Go 协同程序(Coroutines 协程)、Go 汇编及一些注意事项。

    参考:  Go 汇编函数 - Go 语言高级编程 Go 嵌套汇编 - 掘金 (juejin.cn) 前言: Golang 适用 Go-Runtime(Go 运行时,嵌入在被编译的PE可执行文件之中)来管理调度协同程式的运行。 Go 语言没有多线程(MT)的概念,在 Go 语言之中,每个 Go 协程就类似开辟了一个新的线程,效率上,肯

    2024年01月25日
    浏览(59)
  • MySQL5 和 MySQL8 的配置区别 & 一些注意事项

    先保证你的mysql正在运行,假如用户名是 root ,密码是 123456 ,运行下边的代码可以查看mysql的版本号。 这里我的版本是5.7.19。也就是5版本的。 注意:下边的url区别不用管。看到这就可以了。 当然8版本的后边不写也没事。 不建议在没有服务器身份验证的情况下建立SSL连接。

    2024年02月05日
    浏览(28)
  • yolov8使用C++推理的流程及注意事项  undefined reference to `xxxxx‘

    1.下载yolov8项目源码GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch ONNX OpenVINO CoreML TFLite  2.下载opencvReleases - OpenCV,建议版本=4.7.0,选择下载源码, windows版本由于使用的编译器与我们所使用的mingw不一致,后续会出现错误,所以我们选择自己编译 3.下载cmake编译工具,添加到环

    2024年02月11日
    浏览(25)
  • 学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

    本篇分享学习Linux过程中的一些经验 Linux严格区分大小写 Linux中所有内容以文件形式保存 ,包括硬件,Linux是以管理文件的方式操作硬件 硬盘文件是 /dev/sd[a-p] 光盘文件是 /dev/sr0 等 对于设置需要写入文件,命令行的设置在重启之后就会失效,只有下入文件才可以保存下来 文

    2024年02月11日
    浏览(55)
  • Golang 包使用注意事项

    1)在给一个文件打包时,该包对应一个文件夹,比如这里的utils文件夹对应的包名就是utils, 文件的包名通常和文件所在的文件夹名一致,一般为小写字母。 2)当一个文件要使用其它包函数或变量时,需要先引入对应的包 引入方式1:import \\\"包名\\\" 引入方式2: 3)package指令在

    2024年02月03日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包