多态小Tips

news2024/11/17 17:40:50

目录

1.虚函数

 2. 设置为虚函数

 3.多态

 4.多态类型的调用  

 5.抽象类和纯虚函数

 6.虚表

 7.练习题 


1.虚函数

虚函数是被virtual修饰的类成员函数

virtual关键字只在声明时加上,在类外实现时不能加。

 

 static和virtual不能同时使用。

 2. 设置为虚函数

 首先,虚函数必须是类成员函数。

                                            成员函数 VS 非成员函数

 成员函数简单来说就是类中定义的函数,作为一个类的成员。

 而非成员函数就是不在类中定义的函数,其中友元函数就属于非成员函数。(友元函数可以   直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类

1.因此友元函数不能设置为虚函数。

2.静态成员函数不能设置为虚函数。

原因一:static和virtual不能同时使用 

原因二:静态成员函数与具体对象无关,属于整个类,核心关键是没有隐藏的this指针,可以通过类名::成员函数名 直接调用,此时没有this无法拿到虚表,就无法实现多态,因此不能设置为虚函数

3.父类的析构函数建议设置为虚函数 

 这样动态释放父类指针所指的子类对象时,能够达到析构的多态

 3.多态

1. 多态分为编译时多态和运行时多态,也叫早期绑定和晚期绑定,还被叫做静态多态和动态多态。

2.编译时多态通过函数重载和模板来实现的。

3.运行时多态,还被叫做覆盖,重写,基于虚函数机制实现多态功能

 4.多态类型的调用  

判断正误:

在编译期间,通过传递不同类的对象,编译器选择调用不同类的虚函数 (x)

解释:不是在编译期,而应该在运行期间,编译期间,编译器主要检测代码是否违反语法规则,此时无法知道基类的指针或者引用到底引用那个类的对象,也就无法知道调用那个类的虚函数。在程序运行时,才知道具体指向那个类的对象,然后通过虚表调用对应的虚函数,从而实现多态。 

 5.抽象类和纯虚函数

纯虚函数可以有函数体(函数实现),但是意义不大,因为抽象类没办法实例化对象。

 抽象类可以定义为指针,而且经常这样做,其目的就是用父类指针指向子类从而实现多态

 6.虚表

多继承的时候,可能会有多张虚表 

虚表时在编译期间生成的。

当定义多个对象时,同一个类的虚表是共享的。

当子类的虚函数重写但是为私有(private)时,若构成多态,也能访问的了,因为多态仅仅是用子类虚函数的地址覆盖虚表,实际要调用的时候直接去虚表里找地址就行了,不受private的限制。

 7.练习题 

 

//以下程序输出结果是( )
class A
{
public:
    A() :m_iVal(0) { test(); }

    virtual void func() { std::cout << m_iVal <<endl; }

    void test() { func(); }
public:
    int m_iVal;
};

class B : public A
{
public:
    B() { test(); }
    virtual void func()
    {
        ++m_iVal;
        std::cout << m_iVal <<" ";
    }
};
int main()
{
    A* p = new B;

    p->test();

    return 0;
}

A.1 0

B.0 1

C.0 1 2

D.2 1 0

E.不可预期

F. 以上都不对

分析:new B时先调用父类A的构造函数,执行test()函数,在调用func()函数,由于此时还处于构造B对象阶段,多态机制还没有生效,所以,此时执行的func函数为父类的func函数,打印0,构造完父类后执行子类构造函数,又调用test函数,然后又执行func(),由于父类已经构造完毕,虚表已经生成,func满足多态的条件,所以调用子类的func函数,对成员m_iVal加1,进行打印,所以打印1, 最终通过父类指针p->test(),也是执行子类的func,所以会增加m_iVal的值,最终打印2, 所以答案为C 0 1 2

变式:将A*p=new B改为B*p=new B,结果又如何?

前面还是一样,先打印0,再打印1,然后通过子类指针p->test() ,但是test()是父类作用域里的,只是子类继承下来的,实际上test()函数里还隐藏一个t父类的this指针,再由这个this指针去调用func,而func是虚函数,并且子类也进行了重写,而且还是父类的this指针调用,满足多态,所以还是执行子类的func,增加m_iVal的值,最终打印2, 所以答案还是C 0 1 2

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

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

相关文章

企业网盘选购攻略,如何选择最适合你的云存储服务?

在如今的企业办公中&#xff0c;每天都会产出各种不同类型的文件&#xff0c;传统纸质文件的管理方式&#xff0c;不仅不方便协作&#xff0c;而且容易丢失。于是企业将目光转向企业网盘工具&#xff0c;企业网盘的热门肯定了其在文件管理与协作方面的表现。那么企业网盘哪个好…

网络安全(非常详细)从零基础入门到精通,看完这一篇就够了。

学习网络安全方向会遇到哪些问题&#xff1f; 1.打基础的时间长 学基础花费了很长的时间&#xff0c;光学语言都有好几门&#xff0c;有的人会止步于学习linux系统及命令的路上&#xff0c;更多的人会停在学习语言上面&#xff1b; 2.知识点掌握的不够清楚 对于网络安全基础…

OpenPCDet系列 | 5.模型前向传播流程

文章目录 前向传播流程1. 模型初始化2. 模型训练前向传播前向传播流程 这里以PointPillars模型为例,在PointPillars模型中主要划分了以下4个主要的模块,以下某块首先会在build_network中进行初始化,然后在具体前向传播时通过forward函数进行。下面进行区分。 PointPillars…

TCP/IP网络编程(二)

TCP/IP网络编程读书笔记 第7章 优雅地断开套接字连接7.1 基于TCP的半关闭7.1.1 单方面断开连接带来的问题7.1.2 套接字和流&#xff08;Stream&#xff09;7.1.3 针对优雅断开的shutdown函数7.1.4 为何要半关闭7.1.5 基于半关闭的文件传输程序 7.2 基于Windows的实现7.3 习题 第…

揭秘|从帕丽斯·希尔顿引领其帝国进入元宇宙学到的品牌建设经验

你是否曾想过&#xff0c;元宇宙是如何与世界上的知名品牌和名人达成合作的&#xff1f;在本期的文章中&#xff0c;我们邀请了 11:11 媒体的 Web3 和元宇宙总监 Cynthia Miller&#xff0c;一起探讨帕丽斯希尔顿如何通过 Parisland 和 Cryptoween 将她的帝国带入 The Sandbox&…

嵌入式学习笔记——IIC通信

IIC通信 前言IIC概述通信特征物理拓扑结构IIC通信的流程IIC的特点&#xff1a; STM32的IIC通信GPIO模拟IICIIC的时序组成&#xff08;主机对从机写入数据&#xff09;1.起始信号2.器件地址与读写位3.从机应答信号5.传输的数据与结束信号 IIC的时序组成&#xff08;主机对从从机…

MySQL调优系列(二)——数据类型优化

一、总则 1、更小的数据类型更好 应该尽量使用可以正确存储数据的最小数据类型&#xff0c;更小的数据类型通常更快&#xff0c;因为它们占用更少的磁盘、内存和CPU缓存&#xff0c;并且处理时需要的CPU周期更少&#xff0c;但是要确保没有低估需要存储的值的范围&#xff0c…

OpenCV中的图像处理3.1-3.3(三)色彩空间、几何变换、阈值处理

目录 3.1 改变色彩空间目标改变色彩空间对象跟踪如何找到HSV值来追踪&#xff1f;练习 3.2 图像的几何变换目标变换缩放平移旋转仿射变换透视变换其他资源 3.3 图像阈值处理目标简单的阈值处理自适应阈值处理Otsu的二值化Otsu的二值化是如何工作的&#xff1f;其他资源练习 翻译…

Netty基础(二)

1.Netty高性能架构设计 1.1.线程模型基本介绍 1>.不同的线程模式,对程序的性能有很大影响,为了搞清Netty线程模式,我们来系统的讲解下各个线程模式,最后看看Netty线程模型有什么优越性; 2>.目前存在的线程模型有: ①.传统阻塞I/O服务模型; ②.Reactor(反应器)模式; 3…

The Annotated Diffusion Model(翻译)

The Annotated Diffusion Model&#xff08;翻译&#xff09; 来源&#xff1a; https://huggingface.co/blog/annotated-diffusion code: 在这篇博文中&#xff0c;我们将更深入地研究去噪扩散概率模型&#xff08;也称为 DDPM、扩散模型、基于分数的生成模型或简称为自动编…

一、PEMFC基础之热力学

一、PEMFC基础之热力学 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图2.可逆电压与温度和压力的关系3.能斯特方程4.燃料电池效率 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图 2.可逆电压与温度和压力的关系 标准状态可逆电压Er计算&#xff1a; E …

JAVA15新特性

JAVA15新特性 概述 2020年9月15日,java15正式发布,(风平浪静的一个版本)共有14个JEP,是时间驱动形式发布的第六个版本.相关文档: https://openjdk.java.net/projects/jdk/15/ 一个孵化器阶段,三个预览,两个废弃和两个移除 JAVA15参与企业 java各版本主要特征 JDK5 :enum 泛型…

【面试】面试官:说一下线程池7个参数的含义?

文章目录 前言一、参数1&#xff1a;corePoolSize二、参数2&#xff1a;maximumPoolSize三、参数3&#xff1a;keepAliveTime四、参数4&#xff1a;TimeUnit五、参数5&#xff1a;BlockingQueue六、参数6&#xff1a;ThreadFactory七、参数7&#xff1a;RejectedExecutionHandl…

5月1日启动|2023年CSC西部/地方合作项目即将申报

2023年国家留学基金委&#xff08;以下简称CSC&#xff09;西部地区人才培养特别项目&#xff08;以下简称“西部项目”&#xff09;及地方合作项目选派工作即将开始&#xff0c;为此知识人网小编整理出以下申请要点&#xff0c;提醒申请者注意。 一、可以申报的省份 1.西部项…

hive sql实战案例-访问开始结束时间

问题描述 现在我们有一张用户访问区域的记录表&#xff0c;有三个字段&#xff1a;user_id表示用户ID&#xff0c;area表示用户访问的区域&#xff0c;visit_time是访问时间。求用户对某一区域访问的开始和结束时间&#xff0c;结果如右表所示。 分析问题 101访问了上午和晚…

InnoDB 与MyISAM 的区别

MyISAM和InnoDB都是Mysql里面的两个存储引擎。 在Mysql里面&#xff0c;存储引擎是可以自己扩展的&#xff0c;它的本质其实是定义数据存储的方式以及数据读取的实现逻辑。 不同存储引擎本身的特性&#xff0c;使得我们可以针对性的选择合适的引擎来实现不同的业务场景。从而获…

大数据框架-Hadoop

大数据框架-Hadoop 1.什么是大数据 大数据是指由传统数据处理工具难以处理的规模极大、结构复杂或速度极快的数据集合。这些数据集合通常需要使用先进的计算和分析技术才能够处理和分析&#xff0c;因此大数据技术包括了大数据存储、大数据处理和大数据分析等方面的技术和工具…

工作日记NO.2

1. 安装局域网内网通&#xff1b; 2. 安装VS2017AutoCADObjectARX VS2017AutoCAD2020配置ObjectARX VS2017AutoCAD2020配置ObjectARX (dgrt.cn) 3. ObjectARX简介 ObjectARX简介 - CAD安装教程 - 土木工程网 (civilcn.com) CAD系统二次开发-ObjectARX中的实体造型技术 (r…

【LeetCode】9,回文数。 难度等级:简单。巧妙解法很多,值得推敲。

文章目录 一、题目二、我的解答&#xff1a;逐个判断对应位置的首末数字是否相同三、其他解答3.1 将数字x转为字符串进行处理3.2 反转一半数字进行比较 LeetCode 第9题&#xff0c;回文数&#xff1b;难度等级&#xff1a;简单 一、题目 二、我的解答&#xff1a;逐个判断对应…

【C++复习1】程序结构和C++的工作原理

如果你是一名newbird的话&#xff0c;建议先看如下的视频加深理解后&#xff0c;再看下面的内容&#xff1a; https://www.bilibili.com/video/BV1N24y1B7nQ?p6 声明 以下的内容均由chatGpt编写与对上面这个视频进行总结生成&#xff0c;我就只负责改改格式。 C的工作原理 …