C++ 子类继承父类纯虚函数、虚函数和普通函数的区别

2023-11-06

C++三大特性:封装、继承、多态,今天给大家好好说说继承的奥妙

1、虚函数:

  C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。子类可以重写父类的虚函数实现子类的特殊化

2、纯虚函数:

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

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

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

3、普通函数:

  普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。

  普通函数是父类为子类提供的“强制实现”。

  因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。

4、看具体运用实例:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     virtual void out1()=0;  ///由子类实现
 8     virtual ~A(){};
 9     virtual void out2() ///默认实现
10     {
11         cout<<"A(out2)"<<endl;
12     }
13     void out3() ///强制实现
14     {
15         cout<<"A(out3)"<<endl;
16     }
17 };
18 
19 class B:public A
20 {
21 public:
22     virtual ~B(){};
23     void out1()
24     {
25         cout<<"B(out1)"<<endl;
26     }
27     void out2()
28     {
29         cout<<"B(out2)"<<endl;
30     }
31     void out3()
32     {
33         cout<<"B(out3)"<<endl;
34     }
35 };
36 
37 int main()
38 {
39     A *ab=new B;
40     ab->out1();
41     ab->out2();
42     ab->out3();
43     cout<<"************************"<<endl;
44     B *bb=new B;
45     bb->out1();
46     bb->out2();
47     bb->out3();
48 
49     delete ab;
50     delete bb;
51     return 0;
52 }

5、总结:

因为继承最主要的场景就是有多个类用的接口基本上一样,那么就需要一个抽象类,如果这个抽象类全是纯虚函数,

那么子类需要全部继承并且定义,这样带来的问题就是可能有的类不需要这个接口但是还必须写上且空定义,这样很累,

那就需要一部分虚函数接口,所以根据实际情况,组合纯虚函数和虚函数来使用。

6、在c++中,父类和子类虚函数都有对应的虚函数表,如果子类重写了虚函数,就会将新写的这个函数的地址放到他自己的表内,并且通过父类的指针指向子类所开辟的空间,这样就可以通过父类对象调用子类的方法

class  Base

{

public:

void  virtual  Func()

{

cout << "Base\n";

}

};

class  Derived : public  Base

{

public:

void  Func()

{

cout << "Derived\n";

}

};

void main()

{

Base* a = new Base;

a->Func();

输出:base

Base* b = new Derived();

b->Func();

输出:device

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 子类继承父类纯虚函数、虚函数和普通函数的区别 的相关文章

随机推荐

  • 关于idea出现java: 无效的目标发行版: 8、9、11问题的解决方式

    1 首先Project settings 将环境设置为1 8 2 如果有多个module都要设置一下 3 都设置好了之后点击apply应用 点击ok关闭设置页面 然后点击File gt settings 进入设置页面 找到 Java Com
  • 腾讯策略协作型 AI「绝悟」升级至王者荣耀电竞职业水平

    感谢阅读腾讯AI Lab微信号第80篇文章 本文将介绍腾讯策略协作型 AI 绝悟 最新进展 达到王者荣耀电竞职业水平 长线策略及团队协作能力全面提升 腾讯 AI Lab 与王者荣耀共同探索的前沿研究项目 策略协作型 AI 绝悟 今天在吉隆坡
  • 经典排序算法:快速排序(Quick Sort)

    快速排序算法 快速排序算法被称为20世纪十大算法之一 是最重要的算法之一 是一定要掌握和熟练的 快速排序的基本思想是 分治法 1 先从数列中取出一个数作为基准数 2 分区过程 将比这个数大的数全放到它的右边 小于或等于它的数全放到它的左边
  • jdbc:mysql://127.0.0.1:3306/test_: No suitable driver found for jdbc:mysql://127.0.0.1:3306/bank

    今天遇到个很奇怪的问题 项目登录上去之后 去修改某张表的一条记录 突然报错 No suitable driver found for jdbc mysql 127 0 0 1 3306 bank 项目可以登录 那就不是数据库配置文件的问题
  • 状态压缩技巧:动态规划的降维打击

    刷题认准labuladong 东哥带你手把手撕力扣 点击下方卡片即可搜索 我们号之前写过十几篇动态规划文章 可以说动态规划技巧对于算法效率的提升非常可观 一般来说都能把指数级和阶乘级时间复杂度的算法优化成 O N 2 堪称算法界的二向箔 把
  • 史上最全的maven pom.xml文件教程详解

    原文地址 http www zuidaima com share 1781583829978112 htm
  • 部署Prometheus

    1 解压prometheus压缩包 root node5 tar xf prometheus 2 38 0 linux amd64 tar gz C usr local 2 对压缩后的文件做软连接 root node5 ln sv usr
  • 人工智能技术的应用越来越广,极大促进了无人机产业的发展

    备受关注的第二十三届中国国际高新技术成果交易会 简称 高交会 于12月27日在深圳开幕 本届高交会分别在深圳会展中心 福田 和深圳国际会展中心 宝安 同期举办 吸引了众多优秀展商一展风采 本届高交会采用了 线上 线下 联动的方式 线下展览总
  • Shell脚本基础介绍

    shell基础简介 编写脚本通常使用某种基于解释器的编程语言 而shell脚本不过就是一些文件 我们能将一系列需要执行的命令写入其中 然后通过shell来执行这些脚本 进入Linux系统 Ubuntu 打开终端Terminal 表示普通用户
  • 【深度学习】- NLP系列文章之 1.文本表示以及mlp来处理分类问题

    系列文章目录 1 文本分类与词嵌入表示 mlp来处理分类问题 2 RNN LSTM GRU三种方式处理文本分类问题 3 评论情绪分类 还是得开个坑 最近搞论文 使用lstm做的ssd的cache prefetching 意味着我不能再划水了
  • JS实现一键回到顶部的功能(兼容所有浏览器,超级详细)

    我们在浏览网页的时候 大部分都有一个一键回到顶部的按钮 无论是pc端还是移动端 这个功能都很常见 我在一次面试的时候 也要求手写这个功能 首先我们新建一个空页面 把body的高度设置为3000px 这样做的目的是让浏览器出现滚动条 不然我们
  • 动态数组的实现

    public class MyArrayList
  • 栈与队列 数据结构 C语言

    目录 一 栈 1 类型定义 2 接口函数 3 功能实现 初始化栈 进栈 删除栈顶 出栈 销毁栈 其他功能 一 栈 先进后出 后进先出 1 类型定义 typedef int STDataType typedef struct Stack ST
  • 如何用Python进行大数据挖掘和分析?快速入门路径图!

    大数据无处不在 在时下这个年代 不管你喜欢与否 在运营一个成功的商业的过程中都有可能会遇到它 什么是 大数据 大数据就像它看起来那样 有大量的数据 单独而言 你能从单一的数据获取的洞见穷其有限 但是结合复杂数学模型以及强大计算能力的TB级数
  • main函数参数int main(int argc, char *argv[])解析

    main函数可以不带参数 也可以带参数 这个参数可以认为是 main函数的形式参数 C语言规定main函数的参数只能有两个 习惯上这两个参数写为argc和argv 所以C99标准中规定只有以下两种定义方式是正确的 int main void
  • Redis使用Zset做一个排行榜,当权值一样时,怎么按时间排序

    前言 zset是根据score进行排序 当score相同时 默认按照member的字典序进行排序 案例说明 127 0 0 1 6379 gt zadd t1 2 c 1 b 2 a integer 3 127 0 0 1 6379 gt
  • 关于pytorch的backward()

    pytorch中的loss backward 是梯度反传 计算每一个变量的grad 只是之前在纠结GAN的两个loss什么时候反传 参数什么时候更新的时候 观察到backward 后 内存的存储量下降 原来反传完毕之后 就把中间计算变量都释
  • VS code配置C语言,详细教程,初学者专用(附需要的插件)(win系统)

    vscode配置C语言首先下载vscode 这里我就不多说了 我们自己在使用vscode配置c语言后发现c语言根本就不能运行 是因为我们缺少一个配置c语言的插件需要我们自己下载 因为vscode不提供 这里是插件的链接 需要大家自己去提取
  • Windows10自带远程桌面连接Linux--CentOS的操作系统

    加粗样式看到网上好多的都是关于ubuntu类型的连接 或者就是自己在下个软件去连接Linux 而并非是用自带的 本文将为大家自动rdp去连接 1 默认库不包含xrdp 需要安装epel库 yum install epel release y
  • C++ 子类继承父类纯虚函数、虚函数和普通函数的区别

    C 三大特性 封装 继承 多态 今天给大家好好说说继承的奥妙 1 虚函数 C 的虚函数主要作用是 运行时多态 父类中提供虚函数的实现 为子类提供默认的函数实现 子类可以重写父类的虚函数实现子类的特殊化 2 纯虚函数 C 中包含纯虚函数的类