【C++】虚函数

类中声明函数成员的时候,在函数的前面加上virtual关键字,则该成员为虚函数

虚函数的特点

  1. 如果在类中定义的虚函数,那么系统会为这个类维护一个虚函数表
  2. 类中会多出4个字节的指针去指向这个虚函数表,在虚函数表中保存了虚函数的首地址,在调用虚函数的时候就会先到表中查找虚函数,然后调用,就比普通函数多了步操作
  3. 虚函数表不会被继承,但是表中的项会被继承(虚函数会被继承)

虚函数的作用

通过类的继承及虚函数来实现多态

  1. 有两个类,他们之间是父子关系
  2. 子类和父类有同名的虚函数,但是功能不同
  3. 父类指针或引用指向父类或子类对象,指向哪个对象就可以调用哪个对象的虚函数成员

示例:

#include<iostream>
using namespace std;class Animal {
public:virtual void speak() {cout << "动物在说话" << endl;}
};class Cat :public Animal {
public:virtual void speak() {//子类重写父类的虚函数cout<<"猫在喵喵叫" << endl;}
};
int main() {//调用:父类指针指向子类对象Animal* p = new Cat;p->speak();//调用的是Cat的speak()delete p;
}

多态下释放的注意事项

基类中有虚函数时,且通过父类指针去分配子类对象的时候,在释放的时候只能通过父类指针去进行释放,在delete父类指针的时候会调用父类的析构函数,而不会调用子类的析构函数;需要把父类的析构函数定义为虚析构,那么在释放父类指针的时候也就会调用子类的析构函数了。

以上面示例为例:

#include<iostream>
using namespace std;class Animal {
public:virtual ~Animal() {cout << "调用了父类析构" << endl;}virtual void speak() {cout << "动物在说话" << endl;}
};class Cat :public Animal {
public:~Cat() {cout << "调用了子类析构" << endl;}virtual void speak() {//子类重写父类的虚函数cout<<"猫在喵喵叫" << endl;}
};
int main() {//调用:父类指针指向子类对象Animal* p = new Cat;p->speak();//调用的是Cat的speak()delete p;
}

输出:

猫在喵喵叫
调用了子类析构
调用了父类析构

注意:构造函数不能是虚函数

纯虚函数

纯虚函数是一种特殊的虚函数。在基类中不能为虚函数给出有意义的实现,就可以把它声明为纯虚函数,然后把它的实现留给派生类去完成。

定义:virtual 函数返回值类型 函数名(函数参数)=0;

在C++中没有interface关键字,“接口”的概念靠纯虚函数实现

示例:

#include<iostream>
#include<string>class Printable {
public:virtual std::string GetID() = 0;void PrintID() {std::cout << this->GetID() << std::endl;}
};class Student :public Printable {
public:std::string StuID = "S123456";std::string GetID() override {return StuID;}
};class Teacher :public Printable{
public:std::string TeaID = "T654321";std::string GetID() override {return TeaID;}
};int main() {Student stu;stu.PrintID();Teacher tea;tea.PrintID();
}

Student类和Teacher类可以看作是实现了“Printable接口”

纯虚析构

析构函数也可以声明成纯虚析构,类内写声明,不用实现;但要在类外实现。

virtual ~类名()=0;//纯虚析构的类内声明
类名::~类名(){};//纯虚析构的类外实现

抽象类

  1. 在一个类中具有一个及以上纯虚函数,那么这个类被称之为抽象类
  2. 抽象类不能实例化对象,但是可以定义指针,只能作为基类为派生类服务
  3. 如果派生类中没有完全实现基类中所有的纯虚函数,那么该派生类也会变成抽象类,同样不能实例化对象

final

  • 可以阻止成员函数的重写:virtual void fun() final
  • 可以阻止类的继承:class C1 final

注:一个抽象类被阻止继承,那么这个类就没有任何作用(一般不会这样写)

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

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

相关文章

如何在UI自动化测试中创建稳定的定位器?

如何在UI自动化测试中创建稳定的定位器&#xff1f; 前言1. 避免使用绝对路径2. 避免在定位器中使用索引3. 避免多个类名的定位器4. 避免动态和自动生成的ID5. 确保定位器唯一6. 处理隐藏元素的策略7. 谨慎使用基于文本的定位器8. 使用AI创建稳定的定位器 总结 前言 在自动化测…

明日宣讲 香港科技大学广州|数据科学与分析学域硕博招生宣讲会【湖南大学专场】

&#x1f4e3;&#x1f4e3;&#x1f4e3;明日宣讲 香港科技大学广州&#xff5c;数据科学与分析学域硕博招生宣讲会【湖南大学专场】 时间&#xff1a;2024年12月10日&#xff08;星期二&#xff09;15:00 地点&#xff1a;湖南大学信息科学与工程学院624会议室 报名链接&…

BurpSuite-8(FakeIP与爬虫审计)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;IP伪造和爬虫审计_哔哩哔哩_bilibili 一、FakeIP 1.配置环境 BurpSuite是java环境下编写的&#xff0c;而今天的插件是python编写的&#xff0c…

2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题(中职组)

2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题&#xff08;中职组&#xff09; 1.基础设置和安全强化&#xff08;xxx 分&#xff09;1.3. 任务内容: 2.安全监测和预警&#xff08;xxx 分&#xff09;2.1. 任务一&#xff1a;建立目录安…

Qt C++ 显示多级结构体,包括结构体名、变量名和值

文章目录 mainwindow.hmainwindow.cppstructures.hmain.cpp QTreeView 和 QStandardItemModel 来实现。以下是实现这一功能的步骤和示例代码&#xff1a; 定义多级结构体&#xff1a; 假设你有一个多级结构体&#xff0c;如下所示&#xff1a; struct SubStruct {int subValue…

CISC和RISC的区别

CISC是什么 CISC是一种指令集设计方式&#xff0c;全程叫复杂指令集&#xff0c;这种指令设计模式包含大量的复杂指令和复杂的寻址方式&#xff0c; 以下是CISC架构的一些主要特点&#xff1a; 丰富的指令集&#xff1a;CISC处理器通常包含大量的指令&#xff0c;这些指令覆盖…

20 设计模式之职责链模式(问题处理案例)

一、什么是职责链模式 职责链模式是一种行为型设计模式&#xff0c;它允许将请求沿着处理者的链进行传递&#xff0c;直到有一个处理者能够处理它为止。换句话说&#xff0c;它将请求的发送者和接收者解耦&#xff0c;使得多个对象都有机会处理这个请求&#xff0c;从而避免了将…

linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程

系统服务 书接上文: linux自启任务详解 演示系统:ubuntu 20.04 开发部署项目的时候常常有这样的场景: 业务功能以后台服务的形式提供,部署完成后可以随着系统的重启而自动启动;服务异常挂掉后可以再次拉起 这个功能在ubuntu系统中通常由systemd提供 如果仅仅需要达成上述的场…

ros项目dual_arm_pick-place(moveit和gazebo联合仿真)(一)

目录 前言正文创建功能包具体代码运行 总结 前言 dual_arm_pick-place项目中&#xff0c;实现了两套的moveit和gazebo联合仿真。 启动文件分别是bringup_moveit.launch和arm_bringup_moveit.launch。 在这个项目中&#xff0c;我将代码重新创建了一个包&#xff0c;co_simula…

MySQL 索引(B+树)详解

MySQL 索引&#xff08;B树&#xff09;详解 MySQL逻辑架构对比InnoDB与MyISAM存储结构存储空间可移植性、备份及恢复事务支持AUTO_INCREMENT表锁差异全文索引表主键表的具体行数CRUD操作外键 sql优化简介什么情况下进行sql优化sql语句执行过程sql优化就是优化索引 索引索引的优…

MySQL生产环境备份脚本

全量备份脚本&#xff0c;其中BakDir&#xff0c;ZlbakDir&#xff0c;LogFile需要自己创建 #!/bin/bash export LANGen_US.UTF-8# 指定备份目录 BakDir/root/beifen/data/mysqlbak/data/allbak # 指定增量备份目录 ZlbakDir/root/beifen/data/mysqlbak/data/zlbak # 备份日志…

HTTP multipart/form-data 请求

序言 最近在写项目的过程中有一个需求是利用 HTTP 协议传输图片和视频&#xff0c;经过查询方法相应的方法发现使用 multipart/form-data 的方式&#xff0c;这是最常见处理二进制文件的表单编码类型。  学习了一下午&#xff0c;现在总结一下使用的方法和相关的知识点&#x…

Linux下redis环境的搭建

1.redis的下载 redis官网下载redis的linux压缩包&#xff0c;官网地址:Redis下载 网盘链接&#xff1a; 通过网盘分享的文件&#xff1a;redis-5.0.4.tar.gz 链接: https://pan.baidu.com/s/1cz3ifYrDcHWZXmT1fNzBrQ?pwdehgj 提取码: ehgj 2.redis安装与配置 将包上传到 /…

如何使用靜態IP代理?【詳細教程】

靜態IP地址是手動分配給設備或伺服器的固定不變的 IP。與動態 IP 地址不同&#xff0c;動態 IP 地址由 DHCP 伺服器自動分配&#xff0c;並且會隨時間而變化。​​​​​​​ 如何獲取和設置靜態IP地址 一、檢查是否需要靜態IP&#xff1f; 在配置靜態 IP 之前&#xff0c;請…

监控组态软件的构成与功能

监控组态软件的构成包括系统开发环境、图形界面系统、实时数据库系统等。其功能包括数据采集与控制、人机交互界面、数据处理与存储等。 监控组态软件的构成&#xff1a; 系统开发环境&#xff1a;这是自动化工程设计工程师为实施其控制方案&#xff0c;在组态软件的支持下进行…

Java 基础之 XQuery:强大的 XML 查询语言

一、什么是 XQuery XQuery 是一种函数式语言&#xff0c;专门用于检索以 XML 格式存储的信息。它负责从 XML 文档中查找和提取元素及属性&#xff0c;在网络服务中有着广泛的应用&#xff0c;比如提取信息、生成摘要报告、进行数据转换等。 XQuery 是 W3C 设计的一种针对于 X…

day09性能测试(1)——纯理论

document.querySelector(video).playbackRate 2.5 //可以写任何数字 【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、性能测试概念 2、功能测试 vs 性能测试 3、小结&#xff08;习题&#xff09; 4、性能测试的策略 4.1 基准测试 4.2 负载测试 …

docker-3.docker权限问题

docker权限,每次开机都要重新sudo 目录 1.简介2.解决办法1:当前用户添加到docker用户组(这个方法还是缺权限??)3.解决办法2:临时更改Docker socket文件权限1.简介 Ubuntu下Docker提示permission denied (权限不足)解决办法 安装docker后,执行docker ps命令时提示 perm…

easyExcel实现表头批注

背景&#xff1a; 网上大部分都不能直接使用&#xff0c;为此总结一个方便入手且可用的工具&#xff0c;用自定义注解实现 依赖包&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>…

内部类和Object类

匿名对象 格式&#xff1a; 匿名对象只可以调用一次成员 &#xff1a; 1. 调用一次成员变量 &#xff1a; new 类名(实参).成员变量名&#xff1b; 2.调用一次成员方法&#xff1a; new 类名(实参).成员方法名(实参)&#xff1b; 匿名对象存在的必要&#xff1a;为了提高…