继承易错总结

1.继承会将所有的成员继承下来,但是继承方式限定的是继承下来成员的可见类型(如果是private继承,那么他不论哪里都是不可见的;如果是protected继承在类中是可见的,在类外是不可见的;如果是public继承,在任何地方都是可见的)

2.对于静态成员变量,不计入字节大小

3.虚函数类外定义时,不必加virtual

4.编译时多态——静态多态——模板和重载
运行时多态——动态多态——虚函数

友元函数 构造函数 static静态函数 不能用virtual关键字修饰;
普通成员函数 和析构函数 可以用virtual关键字修饰;

静态成员变量类内声明类外初始化
静态成员变量为什么不能设置为虚函数:
静态成员函数不属于任何成员,属于整个类,不能使用this来访问
virtual构成的虚函数,恰恰是使用this指针访问,this->vfptr-> 虚函数地址
静态成员函数没有this指针,实现多态就是需要不同的对象,调用不同的子类进行访问不同的重写函数

class A
{static int _tem;//静态成员变量类内声明,类外初始化
};int A::_tem = 0;//在类外初始化的时候不加static

静态成员变量会继承使用权,但是不能被包含
静态成员变量不存储在类中,计算类的大小的时候不计算他的字节大小

重载:同一个作用域中,函数名相同,参数类型不同,参数数量不同,参数顺序不同
重定义(隐藏):继承中,函数名相同(可使用作用域进行访问)
重写(覆盖):继承的虚函数中,子类重写父类的虚函数

派生类的构造函数,不写会调用默认的构造函数,但是如果自己写,就要自己调用父类的构造函数(在调用父类的构造函数时,要将父类当成一个整体)

class Base
{
public:Base(){puts("Base()");}Base(int a):_a(a){puts("Base(int a)");}Base(const Base& tem){puts("Base(const Base& tem)");}Base& operator=(const Base& tem){puts("Base& operator=(const Base& tem)");_a = tem._a;return *this;}~Base(){puts("Base");}
private:int _a;
};
class Son:public Base
{
public:Son(){puts("Son()");}Son(int a, int b):Base(a),_b(b){puts("Son(int a,int b)");}Son(const Son& tem):Base(tem){//父类接受子类的对象/引用/指针puts("Son(const Son& tem)");}Son& operator=(const Son& tem){puts("Son& operator=(const Son& tem)");Base::operator=(tem);return *this;}~Son(){//在析构函数的时候,可以不手动调用析构函数//编译器会自动调用父类的析构函数puts("~Son()");}
private:int _b;
};

inline能不能是虚函数:可以(内敛函数没有地址)
多态调用:内敛不起作用(多态调用中,虚函数存在虚函数表中,需要地址,但是内联函数没有地址,所以内敛不起作用)
普通调用:内敛起作用

构造函数能不能是虚函数?不能
虚表是在编译时生成,构造的时候进行初始化
如果构造函数是虚函数,那么在实例化对象的时候,如何应该去虚表中找构造函数的地址,但是这时候虚表还没有初始化

多态调用和普通函数的时间效率?
具体要看是否构成多态,调用需要到需表中找地址进行调用,普通成员函数可以直接调用

多态的本质——虚表
当父类的指针/引用接收子类的地址/对象时,因为是继承会进行切割,将子类的父类那部分切出来,剩下的就是去虚表中找地址进行调用就行了

父类=子类;会将父类的那部分切出来拷贝给父类,但是不会拷贝虚函数表指针
虚函数指针如果进行了拷贝,那么父类对象的虚函数表指针会发生改变,当使用父类对象调用父类的虚函数时,就会发生错误

虚函数继承,继承的是接口,参数类型不会改变;当子类对象要调用父类的函数时,使用切片的手法进行调用
普通函数继承,继承的是实现


子类和父类都有虚函数,子类的虚函数会存到哪里
在这里插入图片描述

从右表中可以看到,应该是有三个虚函数,他们在同一个虚表中
子类中没有虚表,子类的虚函数存到父类的虚表中

在这里插入图片描述

可以记成向上合并

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

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

相关文章

C++ Qt开发:Charts折线图绑定事件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts折线图的常用方法及灵活运用。 在上一…

ZLMediaKit中的RingBuffer

前面的文章讲到ZLMediaKit转流,提到过RingBuffer,它是比较核心的数据结构。这篇文章就来讲讲RingBuffer的用法。 RingBuffer的类体系 RingBuffer是由多个类组成,分为两大功能:存储和数据分发。 存储功能由类RingStorage实现&…

【笔试强化】Day 8

文章目录 一、单选1.2.3.4.5.6.7.8.9.10. 二、编程1. 求最小公倍数解法:代码: 2. 两种排序方法解法:代码: 一、单选 1. 正确答案:B2. 正确答案:A继承具有传递性 3. 正确答案:C数组不是原生类&…

LaTex中参考文献引用

一、引用参考文献 这里我们使用的是BibTeX的引用格式,因此文件中应包括两个文件(.bib-参考文献 和 .bst-文献格式)。 有了这两个文件后,我们在bib文件中创建参考文献:(注意,作者的名字是逗号前…

4.2 媒资管理模块 - 项目搭建、minio文件系统

文章目录 一、搭建媒资服务工程1.1 media-api 工程1.1.1 bootstrap.yaml1.1.2 Maven1.1.3 Nacos 1.2 media-service 工程1.2.1 bootstrap.yaml1.2.2 Maven1.2.3 Nacos1.2.4 分页插件 1.3 media-model 工程1.3.1 QueryMediaParamsDto1.3.2 MediaFiles1.3.3 MediaProcess1.3.4 Me…

nodejs微信小程序+python+PHP汽车租赁管理网站-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

springboot+vue项目如何在linux上部署

在linux上部署项目,是我们实训项目作业的最后一步,此时我们的项目编码测试已经完成,接下来就需要在服务器上部署上线,那么如何部署上线,接下来我会在虚拟机上的CentOS7系统上实现部署, 一.下载JDK 因为我…

搭建一个高效的Python开发环境

“工欲善其事,必先利其器”,这里我们来搭建一套高效的 Python 开发环境,为后续的数据分析做准备。 关于高效作业,对于需要编写 Python 代码进行数据分析的工作而言,主要涉及两个方面。 1. 一款具备强大的自动完成和错…

Unity-Shader-渲染队列,ZTest,ZWrite

Unity-Shader-渲染队列,ZTest,ZWrite ZTest(深度测试)和ZWrite(深度写入)ZTest Less(深度小于当前缓存则通过)ZTest Greater(深度大于当前缓存则通过)ZTest L…

Linux--Shell脚本应用实战

实验环境 随着业务的不断发展,某公司所使用的Linux服务器也越来越多。在系统管理和维护过程中,经 常需要编写一些实用的小脚本,以辅助运维工作,提高工作效率。 需求描述 > 编写一个名为getarp.sh的小脚本,记录局域…

宝塔面板Linux服务器CentOS 7数据库mysql5.6升级至5.7版本教程

近段时间很多会员问系统更新较慢,也打算上几个好的系统,但几个系统系统只支持MYSQL5.7版本,服务器一直使用较低的MYSQL5.6版本,为了测试几个最新的系统打算让5.6和5.7并存使用,参考了多个文档感觉这种并存问题会很多。…

第十一节TypeScript Array(数组)

1、描述 数组对象是使用单独的变量名来存储一系列的值。 比如,你现在有一组数据,存单独变量如下: var data1"Android"; var data2"Java"; var data3"Harmony"; 那如果有10、100个这种变量呢,那…