修改日期:2020/9/6

C++的虚函数

C++的虚函数的特点就是动态绑定,它的意思是动态绑定,在运行的时候,通过引用和指针,可以用基类的类,引用继承该c++类的派生类,虽然指针是基类,但实际上运行的是派生类的函数。

C++虚函数可以说是C++设计模式的基础了。

有一个问题是,有的时候在派生类中定义了一个函数,这个函数与基类中的虚函数的名字一样但是形参不一样,这说明两个不是一个函数呀,这个时候,编译器在动态绑定的时候会报错,他只会去找名字,却不会去对形参。这就让人很恼火。同时,如果虚函数没有覆写,程序员忘了,但编译器并不知道需要覆写。所以C++引入了一种新的思路,那就是override,这个东西能让编译器发现,如果这个函数没有覆盖,就会报错。当然如果不是虚函数,你还非要去覆盖,也会报错。如果是有override,它还会自动去匹配形参列表,如果不匹配,又是报错:你没有覆写。

当然。现在覆写,不意味着以后要覆写,因为虚函数派生类可以继承它。但有的时候,要防止后面的人对当前的虚函数进行覆写,那如果我们把一个东西定义为final,则之后的任何覆盖都是错误的。


虚析构函数

虚析构函数解决的问题是,因为类是动态绑定的,所以虚构的时候可能会出现 queue * a = Queue()的情况。(Queue是queue的派生。有可能派生类自己有一个指针,那总得释放吧。)

这个时候,虚析构函数不知道谁是谁,不知道该怎么析构,这个时候就需要提供一个覆写。

虚函数的生成,并不是不实现这个类了,而后面继承它的类,这个函数都是虚函数,但不一定要覆写。虚函数主要是为了动态绑定。在覆盖的过程中,形参啥的要一样,唯一可能的是,如果要返回的是自己的类型,那可以不一样。添加一个overide也可以表示这这是一个虚函数。

派生类的派生过程,是一个向下降维的过程。基类的指针和引用可以用派生类的东西。

这是因为派生类的集成,是基类和派生类的组合,可以想象那个经典的图,基类是一个基座部分,派生类是一个部分。派生类在处理基类的初始化的过程,是通过调用基类的构造函数来解决的。


纯虚函数

什么是抽象基类呢?是这个类中,有没有实现的函数,这个没有实现的函数就叫做纯虚函数。

纯虚函数的特点是什么呢?就是在其后面加上一个 = 0。

比如:double net_price(int ) = 0

虽然我们可以为net_price提供定义,但这个定义只能在类外提供,然后就算提供了,这个类也不能实现,这个类只有集成它的东西,对它进行覆写才能实现。

那么继承这个抽象基类的派生类,也可以不覆盖这个纯虚函数,但代价就是,它自己也是个抽象类,两个都不能实现,不能变成具体的对象。

那么为什么要实现这个东西呢?

因为有的时候,我们只是需要大家都实现一个相同的接口,提供相同的功能,但是,有可能这个类继承自上一个类,那么,上一个类的有些功能就仍然存在,这会造成,当前的对象也有使用这个功能的能力,可惜,我们根本不需要建立这个对象,这个对象只是中间的一环,甚至建立这个对象是有害的。所以要有个抽象基类。

没有varselect这个函数_C++的虚函数,虚析构函数,纯虚函数相关推荐

  1. 虚函数,虚基类 与纯虚函数 二

    虚函数    还是先看代码 class A { public:     void funPrint(){cout<<"funPrint of class A"<& ...

  2. c ++类成员函数_C ++编程中的数据成员和成员函数

    c ++类成员函数 C ++中的数据成员和成员函数 (Data members and Member functions in C++) "Data Member" and &qu ...

  3. 虚函数,虚基类 与纯虚函数 一

    正文 虚基类    在说明其作用前先看一段代码 class A { public:     int iValue; }; class B:public A { public:     void bPr ...

  4. c++ abort 函数_C ++中带有示例的abort()函数

    c++ abort 函数 C ++ abort()函数 (C++ abort() function) abort() function is a library function of cstdlib ...

  5. c++ sleep函数_C ++ strcpy()和strncpy()函数

    C ++ strcpy() C ++中的strcpy()函数将字符串从源复制到目标. strcpy()原型 char * strcpy(char * dest,const char * src); 该 ...

  6. java sign函数_C / C ++中是否有标准的符号函数(signum,sgn)?

    我想要一个返回负数为-1和正数为+1的函数. http://en.wikipedia.org/wiki/Sign_function编写我自己的很容易,但是似乎应该放在标准库的某个地方. 编辑:具体来说 ...

  7. 析构函数和虚函数、纯虚函数

    置于"-"是析构函数:析构函数因使用"-"符号(逻辑非运算符),表示它为逆构造函数,加上类名称来定义.  析构函数也是特殊的类成员函数,它没有返回类型,没有参数 ...

  8. C++知识点51——虚函数与纯虚函数(下)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109957146 10.练习 示例 class base { public:base() ...

  9. C++ 虚函数和纯虚函数

    C++中这两个概念不容易区分. 首先这两个函数都是为了方便使用多态这种面向对象的特性.下面将介绍两个函数的不同点. 虚函数: 一个类中定义了虚函数,通过指向派生类的基类指针,访问派生类中同名覆盖成员函 ...

  10. C++中的虚函数与纯虚函数

    文章目录 1 C++中的虚函数 1.1 虚函数 1.2 单个类的虚函数表 1.3 使用继承的虚函数表 1.4 多重继承的虚函数表 2 C++中的纯虚函数 1 C++中的虚函数 1.1 虚函数 虚函数的 ...

最新文章

  1. 【实用】面对枯燥的源码,如何才能看得下去?
  2. 解决用navicate远程连接数据库出现1045 access denied for user 'root'@'localhost' using password yes...
  3. 2020华南理工计算机考研分数线,华南理工大学2020考研复试分数线已公布
  4. 隐藏在计算机网卡怎样删除,如何卸载电脑中隐藏的虚拟网卡设备
  5. parsel安装老是失败_Photoshop安装失败解决办法
  6. hdu 2531 Catch him
  7. Hamcrest Matchers,Guava谓词和Builder设计模式
  8. 今天才发现自己美工其实很厉害!
  9. 给小组新成员的一份信
  10. 苏宁易购出售苏宁消费金融39%股权
  11. android滑屏的设计思路,安卓设计如何实现滑动屏幕出现如图的效果
  12. python动态创建对象属性_python – 动态创建类属性
  13. 从大数据角度看你的信用借贷
  14. Swing表格JTable通过JTableModel插入行
  15. 数据库课程设计报告总结
  16. 小程序 局域网 服务器,微信小程序网络请求request局域网下的开发测试
  17. nssa和stub_ospf中stub区域和nssa区域的主要区别是什么?
  18. 区块链是什么通俗解释_区块链是什么,区块链是什么通俗解释
  19. PyQt5初学试验记录(三):Pyinstaller打包小结
  20. iOS 打点上报、无痕埋点

热门文章

  1. Kubernetes 并非灵丹妙药...
  2. 反转!美光、英特尔等多家美企恢复对华为供货;首例云服务器存储侵权案改判,阿里云不担责;英国政府拟严格审查Libra……...
  3. 怎么输出链表长度C语言,下面程序输出结果不,如输出的链表长度结果不对,不知有关问题在哪里。请高手看下...
  4. AI是计算机科学,人工智能计算机科学(79种)...
  5. 华为鸿蒙电脑操作系统测试版,华为鸿蒙测试版下载 华为鸿蒙测试版电脑版下载...
  6. java reader utf-8_解決BufferedReader读取UTF-8文件中文乱码(转)
  7. 状态码202_至少 10 个 HTTP 状态码
  8. Linux环境 Oracle 监听和服务 日常操作
  9. linux rpm包,安装路径查看及改变rpm包默认安装路径
  10. SonarQube启动报错:WrapperSimpleApp: Encountered an error running main: java.nio.file.AccessDeniedExcepti