没有varselect这个函数_C++的虚函数,虚析构函数,纯虚函数

修改日期: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提供定义,但这个定义只能在类外提供,然后就算提供了,这个类也不能实现,这个类只有集成它的东西,对它进行覆写才能实现。

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库初识实训总结_MySQL(数据库)的初识

1.什么是数据库数据库(Database)是按照数据结构来组织、存储和管理数据的仓库2.什么是MySQLMySQL 是最流行的关系型数据库管理系统,在WEB应用方面 MySQL 是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。3.关系数…

jdk1.8要安装什么mysql_Window下安装JDK1.8+Tomcat9.0.27+Mysql5.7.28的教程图解

JDK1.8安装下载打开链接: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html.下拉选择不同jdk版本,图示为window系统下载提示需登录账号可查看这个帖子Oracle账号.安装双击下载的安装包,按提示走就可以安装完成之后…

mysql 实例启动利用binlog恢复_mysql利用binlog进行数据恢复

mysql利用binlog进行数据恢复最近线上误操作了一个数据,由于是直接修改的数据库,所有唯一的恢复方式就在mysql的binlog。binlog使用的是ROW模式,即受影响的每条记录都会生成一个sql。同时利用了binlog基本配置和格式binlog基本配置binlog需要…

php mysql bootstart_PHP MySQL 创建数据库

PHP MySQL 创建数据库数据库存有一个或多个表。你需要 CREATE 权限来创建或删除 MySQL 数据库。使用 MySQLi 和 PDO 创建 MySQL 数据库CREATE DATABASE 语句用于在 MySQL 中创建数据库。在下面的实例中,创建了一个名为 "myDB" 的数据库:实例 (…

.net mysql 类库_(精华)2020年6月27日 C#类库 MySqlHelper(Ado.net数据库封装)

using EFCore.Sharding;using MySql.Data.MySqlClient;using System;using System.Collections.Generic;using System.Data.Common;namespace Core.Util{////// MySql数据库操作帮助类///public class MySqlHelper : DbHelper{#region 构造函数////// 构造函数////// 完整连接字…

ironpython console怎么用_如何在表單中插入ironpython控制台?

I want to make a winform by C#, and add a ironpython console window in it, like a multiline textbox. So I can write python program into it to do some operations in my Winform software.我想通過C#進行winform,並在其中添加一個ironpython控…

mysql修改客户端编码命令_mysql命令行修改字符编码

1、修改数据库字符编码mysql> alter database mydb character set utf8 ;2、创建数据库时,指定数据库的字符编码mysql> create database mydb character set utf8 ;3、查看mysql数据库的字符编码mysql> show variables like character%; //查询当前mysql数…

mysql 查看运行级别_运行级别及进程

/etc/rc.d/rc.sysinit由init进程调用执行完成设置网络、主机名、加载文件系统等初始化工作/etc/rc.d/rc脚本文件由init进程调用执行根据指定的运行级别, 加载或终止相应的系统服务/etc/rc.local脚本文件由rc脚本调用执行保存用户定义的需开机后自动执行的命令默认的7种运行级别…

中班机器人歌曲_机器人幼儿园大班音乐教案

机器人幼儿园大班音乐教案作为一名无私奉献的老师,有必要进行细致的教案准备工作,教案是教学活动的总的组织纲领和行动方案。那么问题来了,教案应该怎么写?以下是小编为大家收集的机器人幼儿园大班音乐教案,供大家参考…

java 主线程等待_Java实现主线程等待子线程

本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明:1、使用Thread的join()方法,join()方法会阻塞主线程继续向下执行。2、使用Java.util.concurrent中的CountDownLatch,是一个倒数计数器。初始化时先设置一个倒数计数初始…

java四个权限_java四种访问权限

引言Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用。下面整理一下,在什么情况下,有哪些访问权限可以允许选择。一、访问权限简介访问权限控制: 指的是本类及本类内部的…

java map removeall_Java删除Map中元素

前言&#xff1a;关于Java从Map中删除元素的使用&#xff0c;可以使用删除单个元素的事实Map.remove。示例&#xff1a;初始化一个Map对象Map map new HashMap<>();map.put(1, "value 1");map.put(2, "value 2");map.put(3, "value 3");m…

java中0x07_JAVA里0X00的表示

相信很多针对报文进行组织与拆解&#xff0c;在C、C里有memset的功能很容易完成字符串里填充0x00&#xff0c;在java里同样很容易做到&#xff0c;则是用\000,八进制来表示。测试代码如下&#xff1a;package j8583.example;import java.util.ArrayList;import java.util.Array…

java nio集群_java – Hazelcast:连接到远程集群

14:58:26.717 [main] INFO c.m.b.p.s.s.HazelcastCacheClient – creatingnew Hazelcast instance14:58:26.748 [main] INFO com.hazelcast.core.LifecycleService –HazelcastClient[hz.client_0_dev][3.2.1] is STARTING14:58:27.029 [main] INFO com.hazelcast.core.Lifecyc…

微信第三方扫描登录 java源代码_微信开放平台基于网站应用授权登录源码(java)...

1. 第三方发起微信授权登录请求&#xff0c;微信用户允许授权第三方应用后&#xff0c;微信会拉起应用或重定向到第三方网站&#xff0c;并且带上授权临时票据code参数&#xff1b;2. 通过code参数加上AppID和AppSecret等&#xff0c;通过API换取access_token&#xff1b;3. 通…

java性能优化方案_Java性能优化要点

Java性能优化要点本文介绍如何通过以下几点从Java中挤压出性能&#xff0c;该大部分经验来自于Netty作者。JITJava即时编译器当Java执行runtime环境时&#xff0c;每遇到一个新的类&#xff0c;JIT编译器在此时就会针对这个类别进行编译(compile)被优化成相当精简的原生型指令码…

java注解 源码_详解Java注解教程及自定义注解

详解Java注解教程及自定义注解更新时间&#xff1a;2016-02-26 11:47:06 作者&#xff1a;佚名 我要评论(0)Java注解提供了关于代码的一些信息&#xff0c;但并不直接作用于它所注解的代码内容。在这个教程当中&#xff0c;我们将学习Java的注解&#xff0c;如何定制注解&…

jpa mysql存储过程_spring data jpa 如何调用mysql存储过程?

A:首先定义存储过程依赖的jpa表&#xff1a;EntityTable(name"evenmngt_childthingtree_tmp")//数据库中的表名NamedStoredProcedureQuery(name "getChildTree1", procedureName "eventmngt.getChildTree1",parameters {StoredProcedureParam…

pdm 导入mysql 注释_PowerDesigner逆向导入MYSQL数据库并显示中文注释(转载)

我想直观的查看数据库表之间的关系与中文注释&#xff0c;发现Navicat Premium下的表模型功能&#xff0c;并没有注释功能:用起来不是很方便。所有想到了用PowerDesigner来逆向MYSQL中的表&#xff0c;并显示中文注释。一、安装ODBC驱动当前环境&#xff1a;window 10 64bitPow…

java高级反射_反射---Java高级开发必须懂的

理解反射对学习Java框架有很大的帮助&#xff0c;如Spring框架的核心就是使用Java反射实现的&#xff0c;而且对做一些Java底层的操作会很有帮助。一、Class类的使用1、万事万物皆对象&#xff0c;(当然&#xff0c;基本数据类型&#xff0c;静态成员不是面向对象(属于类的))&a…