总结继承和多态的一些问题

news/2024/11/27 8:55:19/

在学习了继承和多态后,本人有以下容易造成混乱的点以及问题:

1.区分虚表和虚基表

虚表即虚函数表,存储的是虚函数的地址。另外:虚表是在编译阶段就生成的,一般存在于常量区(代码段)。

虚基表是是存储偏移量的。

注意要区分好:虚表存储的是虚函数的地址!!!而虚函数,是存在代码段中的。

2.区分虚表和虚表指针生成阶段

虚表是在编译阶段就生成的了,而虚表指针是在构造函数初始化列表阶段初始化的。这也侧面回答了下一个问题。

3.构造函可以是虚函数吗?

不行的,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。

4.区分切片和派生类虚表的生成

先来说派生类生成虚表的步骤:

①先是继承了基类的虚表,是把基类的虚表拷贝下来了。

②然后根据重写的虚函数,对虚表进行覆盖。

③最后是把自个类中的虚函数的地址也写进虚表中。

也就是说,派生类的虚表一开始是对基类的虚表的一个拷贝,后面才将其“本土化”。

切片:

我们都知道,多态的的条件是虚函数的重写和必须通过基类的指针或者引用调用虚函数。。那么为什么一定是需要基类的指针或引用呢?

先来看看不用指针或引用,也就是使用基类对象来调用虚函数。当传入的是派生类的对象,然后进行切片,此时我们假设基类对象对派生类对象切片的时候,不仅把属于自己的那一部分拷贝了过去, 还把派生类的虚表也拷贝了过去!如果后面需要基类的虚表的话就找不到了,这也就乱套了。因此,事实上,基类对象对派生类对象切片的时候,不会把派生类的虚表也拷贝过去,切片后将派生类中属于基类的一部分拷贝过去后,此时基类的虚表还是原本的虚表!基类原本的虚表里面都没有派生类重写的虚函数的地址,还要怎么构成多态?

因此,简单的总结就是:派生类对象赋值给基类对象,切片会把派生类中包含的基类成员变量的值拷贝过去,但是派生类的虚表不会给拷贝过去,则函数中这个基类对象的虚表是基类的,所以无法实现多态。而指针或者引用是直接指向派生类对象,不会进行拷贝赋值,这样虚函数表是派生类的虚函数表,故能实现多态。

5.inline函数可以是虚函数吗?

内联函数可以写成虚函数,不过写出虚函数后,这个内联函数就不是内联函数了。

6.静态成员可以是虚函数吗?

不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。

7.析构函数可以虚函数吗?

基类的析构函数最好是虚函数。因为有时候我们难免会用基类指针或引用指向派生类对象,基类的析构函数是虚函数的话,可以准确地调用派生类的析构函数。

8.对象访问普通函数快还是虚函数更快?

首先如果是普通对象,是一样快的。如果是指针对象或者是引用对象,则调用的普通函数快,因为构成多态,运行时调用虚函数需要到虚函数表中去查找。

9.什么是抽象类?抽象类的作用?

一个类中的虚函数如果是纯虚函数的话,那么这个类便是抽象类。另外,纯虚函数可以有函数实体,但是没必要。

抽象类的作用是强制重写虚函数。另外抽象类体现出了接口继承关系


大家如果还有什么问题需要补充的话可以评论告诉我哦!


http://www.ppmy.cn/news/22212.html

相关文章

C++ 面试题-设计模式类问题(万余字总结)

C 面试题-设计模式类问题1 、说说什么是单例设计模式,如何实现2、 简述一下单例设计模式的懒汉式和饿汉式,如何保证线程安全3、 请说说工厂设计模式,如何实现,以及它的优点4 、请说说装饰器计模式,以及它的优缺点5 、请…

Spring Aop 底层责任链思路实现

动手AOP责任链实现 简单了解 AOP Spring 的两个重要特性之一 AOP 面向切面编程 它的作用简单来说就是解耦 可以通过代理类的方式实现在不改变类本身的代码的情况下做到功能上的增强 , 了解它能做些什么我们就可以去思考怎么去实现它 , 这里涉及到责任链模式 (后续在细说) 。 …

软件测试面试之道(持续更新)

1. 软件的生命周期? 软件生命周期是软件从提出,实现,使用,到停止使用的过程。是从可行性研究到需求分析、软件设计、编码、测试、软件发布维护的过程。 2. 常见的测试用例设计方法? (1)等价类…

基于linux5.15.5的IMX 参考手册 --- 5

基于linux5.15.5的IMX 参考手册 — 5 3.7 SDMA (Smart Direct Memory Access)接口 3.7.1概述 Smart Direct Memory Access (SDMA) API驱动程序控制SDMA硬件。它为其他驱动程序提供了一个API,用于在MCU内存空间和外围设备之间传输数据。支持以下特性: •将通道脚本从…

Python解题 - CSDN周赛第25期 - 水池注水

本期四道题都是在每日一练出现过多次的老题,而且后两道题的思维难度颇大,尤其最后一题-水池注水,如果没有提前准备过,问哥是万万不可能在两个小时内做出来的。所以,拿到这个名次,问哥心里其实很虚。提交之后…

DSP_定义一个大的全局数组_探索之路

前言 最近在做基于dsp平台的无通信接口系统辨识,辨识的时候会有很大的数据需要存到一个数组当中,而dsp如果定义一个很大的全局数组,编译会报错。 本文将探索如何解决这个报错以及全局数组的大小极限。 正文 首先,我们定义了一个…

【JVM】Java类加载机制详解

【JVM】Java类加载机制详解 文章目录【JVM】Java类加载机制详解一:类加载子系统1:类加载器子系统的作用2:加载器 ClassLoader 的角色二:类的加载过程1:加载阶段2:验证阶段:确保被加载的类的正确…

Acwing——第 89 场周赛

题目链接 4803. 满足的数 简单 4804. 构造矩阵 中等 4805. 加减乘 困难 题目描述 4803. 满足的数 给定 n个不超过 5 的正整数 a1,a2,…,an。 不妨设 Sa1a2…an。 请你统计,一共有多少个不同的整数 x 能够同时满足以下所有条件: 1≤x≤51≤x≤51≤x≤…