C++基础之虚函数(十七)

一.什么是多态

多态是在有继承关系的类中,调用同一个指令(函数),不同对象会有不同行为。

二.什么是虚函数

概念:首先虚函数是存在于类的成员函数中,通过virtual关键字修饰的成员函数叫虚函数。

性质:如果在基类中定义类的虚函数,那么在派生类中该函数被继承下来仍是虚函数,即使派生类中没有加virtual

重写(覆盖):派生类要保证该虚函数的名字,返回类型,参数列表都要相同。在发生重写时除了虚函数的函数体之外其他的都是在编译的时候确定的。

三.虚函数的实现机制

当基类定义了虚函数,在该类创建对象时就会在对象的存储布局的前面,新增一个虚函数指针,该指针指向虚函数表(简称虚表),在虚表中存有虚函数的入口地址。当派生类继承基类的时候,会吸收基类的成员函数(包括虚函数),那么派生类中也会有虚函数,在派生类创建对象时,也会在派生类对象的存储布局前面新增一个虚函数指针,该指针也会指向派生类自己的虚函数表,该表存有派生类虚函数的入口地址。如果派生类重写了从基类吸收的虚函数,那么就会用派生类自己的虚函数的入口地址覆盖从基类吸收过来的虚函数入口地址。

四.虚函数机制被激活的条件

  1. 基类定义虚函数
  2. 派生类重写该虚函数
  3. 创建派生类对象
  4. 基类指针指向(基类引用绑定)派生类对象
  5. 使用基类指针或引用调用派生类虚函数
#include <iostream>using std::endl;
using std::cout;class Base
{
private:int _ix;
public:Base(int x=0):_ix(x){cout<<"Base(int x=0)"<<endl;}~Base(){cout<<"~Base()"<<endl;}virtualvoid print()const{cout<<"Base::_ix = "<<_ix<<endl;}
};class Derived
:public Base
{
private:int _iy;
public:Derived(int x=0,int y=0):Base(x),_iy(y){cout<<"Derived(int x=0,int y=0)"<<endl;}~Derived(){cout<<"~Derived()"<<endl;}void print()const{cout<<"Derived::_iy = "<<_iy<<endl;}};
void func(Base* base)
{base->print();
}
void test()
{Base base(3);Derived derived(33,44);func(&base);func((Base*)&derived);func(&derived);  
}
int main()
{test();return 0;
}

 

如果不加虚函数会是什么样呢?

五.哪些函数不能设置虚函数

  1. 普通函数:包括自由函数和全局函数,虚函数必须是成员函数,而普通函数是非成员函数。
  2. 内联成员函数:内联成员函数进行函数替换是发生在编译的时候,而虚函数要实现多态要发生在运行的时候;如果将内联函数设置成虚函数就会失去内联的意义。
  3. 静态成员函数:静态成员函数发生在编译的时候,而虚函数要体现多态发生在运行的时候,静态成员函数是共享的,被该类所有对象共享没有this指针。
  4. 友元函数:如果友元函数本身是一个普通函数,那么友元函数不能被设置成虚函数。如果友元函数本身是另外一个类的成员函数,是可以被设置成虚函数的但友元关系不能被继承。
  5. 构造函数:构造函数不能被继承,但是虚函数可以被继承。

六.纯虚函数

定义形式:

virtual <返回类型> 函数名(参数列表)=0;

其中在类中声明纯虚函数,该类被称作抽象类不能创建对象只提供接口作用。纯虚函数的实现放在派生类中,如果派生类没有把基类的纯虚函数全部都实现,那么派生类也是抽象类同样不能创建对象。虽然不可以创建对象,但是抽象类可以创建抽象类的指针,因为指针相当于地址在64位系统中无论什么指针大小都是8个字节,只不过指针的指向数据的跨度不同,但是创建指针是可以的。

其中override表示重写基类的成员函数,如果没有重写就会报错。

#include <iostream>
using std::endl;
using std::cout;class Base
{
public:virtual void print() const =0;
};class Derived
:public Base
{void print() const override{cout<<"Derived::print()const"<<endl;}
};void test()
{//Base base;    errorDerived derived;Base* pbase;pbase=&derived;pbase->print();
}
int main()
{test();return 0;
}

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

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

相关文章

Acunetix v24.3 (Linux, Windows) - Web 应用程序安全测试

Acunetix v24.3 (Linux, Windows) - Web 应用程序安全测试 Acunetix | Web Application Security Scanner 请访问原文链接&#xff1a;https://sysin.org/blog/acunetix/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 重要提…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(3)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 中级教程 https://www.alipan.com/s/unii5YxtM8B 提…

V R虚拟现实元宇宙的前景|虚拟现实体验店加 盟合作|V R设备在线购买

VR&#xff08;虚拟现实&#xff09;技术作为一种新兴的技术&#xff0c;正在逐渐改变人们的生活和工作方式。随着技术的不断进步&#xff0c;人们对于元宇宙的概念也越来越感兴趣。元宇宙是一个虚拟世界&#xff0c;通过VR技术可以实现人们在其中进行各种活动和交互。 元宇宙的…

【JAVA】精密逻辑控制过程(分支和循环语句)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a; 橘橙黄又青-CSDN博客 目标&#xff1a; 1. Java 中程序的逻辑控制语句 2. Java 中的输入输出方式 3. 完成…

图像颜色空间转换算法

图像颜色空间转换算法主要包括RGB到灰度图像的转换、RGB到CMYK的转换、RGB到HSV的转换以及RGB到Lab的转换。下面我将详细介绍每种算法的实现原理&#xff1a; RGB到灰度图像的转换&#xff1a; 对于RGB图像&#xff0c;可以将每个像素点的红、绿、蓝三个通道的值按照一定权重进…

22 多态

目录 多态的概念多态的定义及实现抽象类多态的原理单继承和多继承关系中的虚函数表继承和多态常见的面试问题 前言 需要声明的&#xff0c;下面的代码和解释的哦朴实vs2013x86环境&#xff0c;涉及指针是4bytes&#xff0c;如果要其他平台下&#xff0c;部分代码需要改动。比…

【尚硅谷周阳--JUC并发编程】【第十四章--ReentrantLock、ReentrantReadWriteLock、StampedLock讲解】

【尚硅谷周阳--JUC并发编程】【第十四章--ReentrantLock、ReentrantReadWriteLock、StampedLock讲解】 一、面试题二、简单聊聊ReentrantReadWriteLock1、是什么?1.1、读写锁说明1.2、演变1.3、读写锁意义和特点 2、特点2.1、优点2.2、code演示2.3、结论2.4、从写锁->读锁&…

安装 kubesphere 插件报错Error: UPGRADE FAILED: \“ks-minio\“ has no deployed releases

安装 kubesphere 插件报错Error: UPGRADE FAILED: “ks-minio” has no deployed releases TASK [common : Kubesphere | Creating manifests] ******************************** ok: [localhost] > (item{uname: ucustom-values-minio, ufile: ucustom-values-minio.yaml}…

双指针的详细教程

双指针算法是一种常用的算法技巧&#xff0c;它通常用于在数组或字符串中进行快速查找、匹配、排序或移动操作。 双指针并非真的用指针实现&#xff0c;一般用两个变量来表示下标&#xff08;在后面都用指针来表示&#xff09; 双指针算法使用两个指针在数据结构上进行迭代&a…

pg_rman在恢复服务器上恢复源库的备份

文章目录 说明恢复笔记待恢复的数据库文件所在目录与文件层级如下检查事项具体操作 修改3: mv recovery.conf recovery.done需要重置 wal 日志然后启库检查效果 补充笔记(2024-02-07更新) pg_rman 安装与使用参考: pg_rman 编译安装与使用 说明 需求是能启库就行, 可以接受数据…

什么是nginx正向代理和反向代理?

什么是代理&#xff1f; 代理(Proxy), 简单理解就是自己做不了的事情或实现不了的功能&#xff0c;委托别人去做。 什么是正向代理&#xff1f; 在nginx中&#xff0c;正向代理指委托者是客户端&#xff0c;即被代理的对象是客户端 在这幅图中&#xff0c;由于左边内网中…

第十四届蓝桥杯(八题C++ 题目+代码+注解)

目录 题目一&#xff08;日期统计 纯暴力&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;01串的熵 模拟&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;治炼金属&#xff09;&#xff1a; 代码&#xff1a; 题目四&#xff08;飞机降落 深度…

32-2 APP渗透 - 移动APP架构

前言 app渗透和web渗透最大的区别就是抓包不一样 一、客户端: 反编译: 静态分析的基础手段,将可执行文件转换回高级编程语言源代码的过程。可用于了解应用的内部实现细节,进行漏洞挖掘和算法分析等。调试: 排查软件错误的一种手段,用于分析应用内部原理和行为。篡改/重打…

机器学习理论知识补充

文章目录 1、什么是线性回归1.1、损失函数 2、什么是逻辑回归2.2、损失函数 案例来源 1、什么是线性回归 用一个例子来解释什么是线性回归比较容易理解 假设你想在商场开一家店&#xff0c;想提前预测一下开这家店会不会赚钱&#xff0c;就需要计算成本和收入&#xff0c;成本…

软件测试中的顶级测试覆盖率技术

根据 CISQ 报告&#xff0c;劣质软件每年给美国公司造成约2.08 万亿美元的损失。虽然软件工具是企业和行业领域的必需品&#xff0c;但它们也容易出现严重错误和性能问题。人类手动测试不再足以检测和消除软件错误。 因此&#xff0c;产品或软件开发公司必须转向自动化测试&am…

用CSS实现单行、多行文本溢出隐藏

单行文本溢出 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略号显示 white-space: nowrap; // 规定段落中的文本不进行换行 多行文本溢出 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出…

【2024系统架构设计】案例分析- 2 系统开发基础

目录 一 基础知识 二 真题 一 基础知识 1 结构化的需求分析 结构化特点:自顶向下,逐步分解,面向数据。 三大模型:

java将文件转成流文件返回给前端

环境&#xff1a;jdk1.8&#xff0c;springboot2.5.3,项目端口号&#xff1a;9100 1.待转换的文件 一、路径 二、文件内容 2.controller中代码 package com.example.pdf.controller;import com.example.pdf.service.GetFileStreamService; import org.springframework.web.b…

webpack练习之手写loader

手写一个style-loader来把样式文件插入head里面&#xff0c;准备工作 vue webpack就自己弄了&#xff0c;webpack的一些配置也自己配置好 一、创建index.css文件 .box{width: 100px;height: 100px;background-color: red; }然后在vue的main.js文件中引入它 二、创建自定义l…

Windows下载使用nc(netcat)命令

‘nc’ 不是内部或外部命令&#xff0c;也不是可运行的程序&#xff1f; 点击链接地址&#xff0c;下载压缩包。 完成后解压 使用方式&#xff08;三种&#xff09;&#xff1a; 1、直接双击exe使用 2、把这个exe放到cmd启动的默认路径下 放到默认路径下&#xff0c;使用nc&a…