继承和多态(下)

news2024/11/26 13:30:50

目录

1.多态

2.多态成立的条件

虚函数重写:

虚函数重写的两个例外

3.override 和 final 

4.重载,重定义(隐藏)和重写

 5.抽象类

接口继承和实现继承

6.多态的原理

虚函数表

多态的原理

动态绑定和静态绑定

7.单继承虚表和多继承虚表

单继承虚表的结构

多继承虚表的结构


1.多态

是什么?

多态简单点将就是,不同的对象调用同一个函数结果不同。

虚函数: 非静态成员函数前加virtual修饰同时virtual和static不能同时存在。


2.多态成立的条件

1.虚函数重写

2.通过基类的指针或引用调用

class Base
{
public:
	virtual void func()
	{
		cout << "Base::func()" << endl;
	}
};
class Derived:public Base
{
public:
	virtual void func()//虚函数重写
	{
		cout << "Derived::func()" << endl;
	}

	//派生类的重写函数前可以不加virtual
	//void func()
	//{
	//	cout << "Derived::func()" << endl;

	//}
};

void test(Base& b)//基类
{
	b.func();//通过基类的引用调用函数
}

//void test(Base* b)
//{
//	b->func();通过基类的指针调用
//}
int main()
{
	Base b;
	Derived d;
	test(b);
	test(d);
	return 0;
}

基类调用基类里的函数,派生类调用派生类中的函数,不同的对象调用,调用出的结果不同。

 如果不是通过基类的指针或引用调用,那么就不会构成重写。

void test(Base b)
{
	b.func();//不满足多态调用的条件
}

虚函数重写:

派生类中有与virtual修饰的基类的完全相同的函数有(完全相同就是函数名,返回值和参数相同)

注意:虚函数重写的是函数的实现部分

虚函数重写的两个例外

1. 协变 ( 基类与派生类虚函数返回值类型不同 )
派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指
针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。(了解)
2.析构函数的重写
基类和派生类的析构函数函数名不同,但编译是会将其都处理为destructor()函数。

3.override 和 final 

final:该虚函数不在被重写

class Base
{
public:
	virtual void func()final//虚函数不能重写
	{
		cout << "Base::func()" << endl;
	}
};
class Derived:public Base
{
public:
	virtual void func()//会报错,因为无法重写
	{
		cout << "Derived::func()" << endl;
	}
};

override:检查派生类虚函数是否重写,如果没重写则编译报错

class Base
{
public:
	void func()
	{
		cout << "Base::func()" << endl;
	}
};
class Derived:public Base
{
public:
	void func()override//编译报错,因为不是重写
	{
		cout << "Derived::func()" << endl;

	}
};


4.重载,重定义(隐藏)和重写

重写和重定义的关系:重写是一种特殊的重定义


 

 5.抽象类

纯虚函数:在虚函数后加上 =0

virtual void func() = 0;//纯虚函数

抽象类:就是有纯虚函数的类。

//抽象类
class A
{
public:
	virtual void func() = 0;
};

抽象类不能实例化出对象,只有重写纯虚函数的类才能实例化出对象,如果该派生类没有重写纯虚函数,那么该派生类也是一个抽象类,也无法实例化出对象。

class A
{
public:
	virtual void func() = 0;
};
class B:public A
{
public:
	virtual void func()
	{
		cout << "B:func()" << endl;
	}
};

int main()
{
	A a;//错误,抽象类无法实例化出对象
	B b;//B派生类,重写虚函数,可以实例化出对象
	return 0;
}

接口继承和实现继承

普通函数的继承就是实现继承;纯虚函数和虚函数的重写就是接口的继承,重写的是虚函数的实现部分。


6.多态的原理

虚函数表

class A
{
public:
	virtual void func()//虚函数
	{
		cout << "hello" << endl;
	}
private:
	int _a;
};

int main()
{
	A a;
	return 0;
}

a的类中又一个_vfptr,类型是一个void**的二级指针。_vfptr(v是virtual,f是function)是虚函数表指针,而虚表的本质就是存放虚函数指针的指针数组

class Base
{
	virtual void func1()
	{
		cout << "Base::func1()";
	}
	virtual void func2()
	{
		cout << "Base::func2()";
	}
};

class Derived :public Base
{
	virtual void func1()
	{
		cout << "Derived::func1()";
	}

};

int main()
{
	Base b;
	Derived d;
	return 0;
}

 

 

总结:虚函数指针存在类中,指向虚函数表,虚函数表本质就是数组 ,存的是指向虚函数的函数指针。

多态的原理

void Func(Base& b)
{
	b.func1();
	cout << endl;
}
int main()
{
	Base b;
	Derived d;
	Func(b);
	Func(d);
	return 0;
}

结果: 

 

 在调用func1时是通过类中的虚表指针调用虚表,再通过虚函数表调用相应的函数,Derived中的func1是重写过的,其虚函数表中的相应的指针会被修改了,指向Derived::func1()这个重写后的函数。

简单点说就是虚函数被重写后改变了虚表中指向基类中该虚函数的元素的值,使其指向派生类中重写的虚函数。


动态绑定和静态绑定

静态绑定:就是在编译时就确定了调用哪个函数,比如类中的普通函数。

动态绑定:就是在运行时确定调用哪个函数,就像多态,是通过虚表确定调用哪个函数。


7.单继承虚表和多继承虚表

单继承虚表的结构

多继承虚表的结构

 

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

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

相关文章

C语言高校人员管理系统

该系统使用easyx插件。 以下是部分页面 以下是部分源码&#xff0c;需要源码的私信 #define _CRT_SECURE_NO_WARNINGS 1//vs的取消报警 #include<easyx.h> #include<stdio.h> #include<stdlib.h>#define width 1280 #define height 840 #define font_w 35 …

《样式设计002:tab切换与底部swiper滑动块》

描述&#xff1a;在开发小程序过程中&#xff0c;发现一些不错的案例&#xff0c;平时使用也比较多&#xff0c;稍微总结了下经验&#xff0c;以下内容可以直接复制使用&#xff0c;希望对大家有所帮助&#xff0c;废话不多说直接上干货&#xff01; 一、tab切换与底部swiper滑…

AD9826 spi读写源码贡献

AD9826是一款专为成像应用设计的模拟信号处理器&#xff0c;它采用三通道架构&#xff0c;设计用于对三线彩色CCD阵列的输出进行采样和调理。这款处理器集成了多个关键功能组件&#xff0c;包括输入箝位电路、相关双采样器(CDS)、偏移DAC和可编程增益放大器(PGA)&#xff0c;并…

新手小白的pytorch学习第八弹------分类问题模型和简单预测

目录 1 启动损失函数和优化器2 训练模型创建训练和测试循环 3 预测和评估模型 这篇是接着新手小白的pytorch学习第七弹------分类问题模型这一篇的&#xff0c;代码也是哟~ 1 启动损失函数和优化器 对于我们的二分类问题&#xff0c;我们经常使用 binary cross entropy 作为损…

秋招突击——7/19——队列同步器AQS学习

文章目录 引言基础知识简介AQS接口和示例第一类&#xff1a;访问和修改同步状态的方法第二类&#xff0c;5个重写的方法第三类&#xff0c;9个模板方法 队列同步器实现原理同步队列独占式同步获取和释放共享式同步获取和释放独占式同步获取和释放 相关面试题怎么理解Lock和AQS的…

如何解决热插拔时的电压过冲

摘要 热插拔是指将上电电压源连接到电子器件的输入电源或电池连接器。热插拔产生的电压瞬态尖峰会损坏器件内部的集成电路。该文解释了此类电压瞬变的根本原因&#xff0c;并提供了防止这些瞬变损坏电子产品中的集成电路(IC) 的可能设计。 1 引言 当将高于 5V 的 USB 适配器…

达梦数据库的系统视图v$dmwatcher

达梦数据库的系统视图v$dmwatcher 查询当前登录实例所对应的守护进程信息&#xff0c;注意一个守护进程可以同时守护多个组的实例&#xff0c;因此查询结果中部分字段&#xff08;N_GROUP、SWITCH_COUNT&#xff09;为守护进程的全局信息&#xff0c;并不是当前登录实例自身的…

BUUCTF - Web - 1

文章目录 1. [极客大挑战 2019]EasySQL 1【SQL注入-万能密码】2. [极客大挑战 2019]Havefun 1【前端代码审计-注释泄漏】3. [HCTF 2018]WarmUp 1【PHP代码审计】4. [ACTF2020 新生赛]Include 1【PHP伪协议】5. [ACTF2020 新生赛]Exec 1【命令注入-基础】6. [GXYCTF2019]Ping Pi…

张量网络碎碎念:CGC

在本系列 上一篇文章 中&#xff0c;我介绍了张量网络的一些基础概念。其中很大一部分来自 github 上一个教程。事实上&#xff0c;该教程的大部分内容来自 e3nn 官网。 除了上篇文章介绍的一些可视化技巧&#xff0c;官网还提供了其他一些可视化模块。使用这些功能能使我们更深…

windows USB 设备驱动开发-开发Type C接口的驱动程序(三)

编写 USB Type C 端口控制器驱动程序 如果 USB Type-C 硬件实现 USB Type-C 或电源传送 (PD) 物理层&#xff0c;但未实现供电所需的状态机&#xff0c;则需要编写 USB Type-C 端口控制器驱动程序。 在 Windows 10 版本 1703 中&#xff0c;USB Type-C 体系结构已得到改进&am…

云监控(华为) | 实训学习day5(10)

Gaussdb安装和连接idea GaussDB的安装 首先关闭防火墙 systemctl disable firewalld.service 永久关闭防火墙&#xff08;发生在下次启动&#xff09; systemctl stop firewalld.service 关闭本次防火墙 查看防火墙状态systemctl status firewalld.service 查询的状态是Dead表…

【算法】百钱买百鸡问题算法详解及多语言实现

问题描述 百钱买百鸡问题是一个经典的数学问题&#xff0c;题目要求用100文钱买100只鸡&#xff0c;公鸡5文钱一只&#xff0c;母鸡3文钱一只&#xff0c;小鸡3只一文钱&#xff0c;问公鸡、母鸡、小鸡各买多少只&#xff1f; 目录 问题描述​编辑 解决方案 Python实现 Ja…

选择Maya进行3D动画制作与渲染的理由

如果你对3D动画充满热情并追求成为专业3D动画师的梦想&#xff0c;你一定听说过Maya——近年来3D动画的行业标准。Maya被3D艺术家广泛使用&#xff0c;你是否想知道为什么Maya总是他们的首选&#xff1f;下面一起来了解下。 一、什么是Maya&#xff1f; 由Autodesk开发的Maya是…

wxid转微信号

7.21由于微信的再一次调整&#xff0c;能够转出微信号的接口已经和谐&#xff0c;根据客户要求琢磨了几个小时 发现新的接口也是可以批量转换的

springcolud学习06Hystrix

Hystrix Hystrix是Netflix开发的一个用于处理分布式系统中延迟和容错问题的库。它主要用于防止分布式系统中的雪崩效应,通过在服务之间添加延迟容错和故障处理机制来增强系统的弹性。 服务熔断 类似于电路中的断路器,当失败率超过阈值时,Hystrix 可以自动地开启断路器,停…

c++习题12-开关灯

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 用例输入 1 10 10 用例输出 1 1,4,9 二&#xff0c;思路 创建可以存放路灯亮灭情况的数组&#xff0c;路灯的编号从1开始&#xff0c;因此在使用for循环去初始化数组时&#xff…

初识模板【C++】

P. S.&#xff1a;以下代码均在VS2022环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

编写小程序用什么软件

编写小程序时&#xff0c;可以使用多种软件或工具&#xff0c;这些工具通常提供了丰富的开发功能和组件&#xff0c;方便开发者进行小程序的创建、开发和调试。以下是一些常用的编写小程序的软件和工具&#xff1a; DIY官网可视化工具 可视化拖拽开发神器|无须编程 零代码基础…

HashMap原理详解,HashMap源码解析

HashMap是一个数组链表和红黑树的结合体 HashMap的第一层表现是数组&#xff0c;HashMap默认创建一个长度为十六的数组来储存数据&#xff0c;但不同的是&#xff0c;它并非是先放在第0个索引&#xff0c;然后第一个索引那么放置&#xff0c;而是通过key获取对应的32位hash值&a…

OAuth2.0 or Spring Session or 单点登录流程

1.社交登录 2.微博社交登录 第三方登录 1.登录微博 2.点击网站接入 3.填写完信息&#xff0c;到这里&#xff0c;写入成功回调 和 失败回调 是重定向&#xff0c;所以可以写本地的地址 3.认证 分布式Session spring-session 域名不一样 发的 jSessionId 就不同&#xff0c…