当前位置: 首页 > news >正文

C++ 多态: 虚函数: 纯虚函数:(java中抽象函数) C++纯虚函数相当于Java中的抽象函数区别:

目录

C++ 多态:

虚函数:

纯虚函数:(java中抽象函数)

C++纯虚函数相当于Java中的抽象函数区别:


C++ 多态:

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。

C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

虚函数:

虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。

我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定

 

纯虚函数:(java中抽象函数)

您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数()

 

例子:

1.虚函数(impure virtual):可以有方法体,返回值为空。

  C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现

  子类可以重写父类的虚函数实现子类的特殊化

  如下就是一个父类中的虚函数:

class A
{
public:
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};

2.纯虚函数(pure virtual):有纯虚函数的类是抽象类。

  C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。

  C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。

  C++中的纯虚函数也是一种“运行时多态”。

  如下面的类包含纯虚函数,就是“抽象类”

 

class A
{
public:
    virtual void out1(string s)=0;
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};

 

C++纯虚函数相当于Java中的抽象函数区别:

java中的抽象函数是只有函数声明,没有方法体。

而c++中的纯虚函数是可以有方法体,也就是说是可以给出定义的,并且,在c++中,子类还可以调用父类的纯虚函数

 

相关文章:

  • C++ 数据抽象,C++ 数据封装
  • c++中数据抽象与数据封装的区别
  • x ,1/x的关系; 反函数的实质:xy可以互换,就是进行坐标轴变化,就是关于y=x对称 反函数性质:f-1(f(x))=x; 反三角函数‘
  • 重要的三角函数公式
  • 函数奇偶性运算法则,以及复合函数奇偶性判断 ln的运算法则,对数函数运算法则 对数函数运算法则口诀,简单记忆
  • 完全二叉树:设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数, 第 h 层所有的结点都连续集中在最左边 满二叉树:深度为k且有2^k-1个结点的二叉树称为满二叉树
  • C++中char * 和char []的区别 堆栈区别 JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
  • 数据结构,完全二叉树,满二叉树
  • 数据结构之图的基本概念
  • p->next 指的是这个节点的指针域 还是下一个节点 单链表逆置; 无序链表与有序链表的区别: 单链表有无头指针遍历:
  • 闭散列,开散列其实就是处理冲突的方式; 散列函数的构造方法 冲突的处理方法 散列表上的查找 哈希之查找失败(当最后一位存在)
  • 线索二叉树,搜索二叉树,AVL二叉树,满二叉树,完全二叉树,平衡二叉树,最优二叉树
  • 并查集,合并 以及优化
  • 邻接矩阵,图的深度优先遍历 图邻接表,深度优先遍历 广度优先遍历 c++中Sort使用
  • 二叉树的四种遍历方法笔记 二叉树删除后操作
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • co.js - 让异步代码同步化
  • GraphQL学习过程应该是这样的
  • Just for fun——迅速写完快速排序
  • laravel 用artisan创建自己的模板
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • vuex 学习笔记 01
  • 不上全站https的网站你们就等着被恶心死吧
  • 多线程 start 和 run 方法到底有什么区别?
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 记一次和乔布斯合作最难忘的经历
  • 力扣(LeetCode)56
  • 如何胜任知名企业的商业数据分析师?
  • 设计模式走一遍---观察者模式
  • 数组大概知多少
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 我从编程教室毕业
  • 一道面试题引发的“血案”
  • 移动端解决方案学习记录
  • 正则与JS中的正则
  • AI算硅基生命吗,为什么?
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​学习一下,什么是预包装食品?​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #《AI中文版》V3 第 1 章 概述
  • #include<初见C语言之指针(5)>
  • (分布式缓存)Redis持久化
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十)T检验-第一部分
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET关于 跳过SSL中遇到的问题
  • .NET轻量级ORM组件Dapper葵花宝典
  • .so文件(linux系统)
  • @Bean注解详解