名字查找、拷贝控制操作与继承体系

2024-08-26 05:12

本文主要是介绍名字查找、拷贝控制操作与继承体系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

假设继承关系为:c->b->a

名字查找与继承体系

每个类都有自己的作用域,在继承体系中,基类(外部)派生类(内部)遵守嵌套作用域的规则:

  1. 内部作用域会隐藏外部作用域

名字查找:

  1. 如果内部作用域存在,则使用内部作用域
  2. 否则逐层查找外部作用域

继承特殊性:

  1. 派生类包含派生类部分,和直接基类部分,直接基类部分,又包含直接基类部分的直接基类部分……
普通成员函数
  1. 作用域:派生类同名成员和函数(即使形参列表不一致)会 隐藏 基类的成员和函数
  2. 类类型(静态类型):调用静态类型成员
  3. 指针/引用类型(动态类型):调用静态类型成员
虚函数
  1. 作用域:派生类同名成员和函数(形参列表必须一致)会 覆盖 基类的成员和函数
  2. 类类型(静态类型):调用静态类型成员
  3. 指针/引用类型(动态类型 & 动态绑定):调用动态类型成员,如果动态类型中没有覆盖,逐层向上查找

注意:除了虚函数的覆盖外,尽量不要定义同名的普通成员和函数

重载和继承:
  1. 如果派生希望基类所有重载版本都是可见,要么全部覆盖,要么一个也不覆盖
  2. 如果覆盖每个函数及其繁琐,可使用using  类::函数名(不用指定形参列表),
  3. 这样就会将所有重载函数添加到派生类中,而派生类只需要定义特有的函数

拷贝控制操作与继承体系

如果一个类没有合成拷贝控制操作,派生类不会继承基类的函数,而是编译器会为派生类合成默认的版本

删除的函数和继承
  1. 如果基类的拷贝控制操作被delete或private,则派生类对应的合成操作也定义为delete的,但如果想要拥有这些操作,可以自定义自己的版本
  2. 如果基类折构函数为delete或private,派生类的默认构造和拷贝构造和移动构造为delete
构造函数
  1. 在默认情况下,创建派生类对象,会自动调用派生类构造函数,而构造函数会调用直接基类的默认构造函数,初始化派生类对象中的基类部分,也可以显示的在初始化列表调用特定的基类构造
  2. //
  3. 如果创建一个派生类,会调用直接基类的构造函数,直接基类的构造又会调用直接基类的直接基类的构造,逐层向上……,最后执行最顶端基类的函数体,逐层向下……,
  4. 当执行基类的构造时,派生类部分是处于未被初始化状态,因此我们不能在基类构造调用派生类的构造,
  5. //
  6. 如果一个类没有合成拷贝控制操作,派生类不会继承基类的函数,而是编译器会为派生类合成默认的版本,但是我们可以使用using继承基类所有的构造函数(默认,拷贝,移动……)
  7. 对于基类每个函数,using会让编译器生成每个对于的派生类构造函数(形参列表是完全相同的)
  8. ……
拷贝 ||  移动构造 & 拷贝 ||  移动赋值
  1. 如果想要拷贝构造 操作,必须在派生类对应的初始值列表,显示调用基类的拷贝 || 移动 函数,否则派生类对象中的基类部分,将执行基类的默认构造函数,这个新的对象会变得非常奇怪
  2. b ( const b& x) : a(x)  &   b(b&& x) : a(std::move(x))
  3. 同样移动也需要显示调用,在重载=运算符函数中
  4. b& operator=( const b& x){ a::operato=(x) }
  5. //
  6. 定义了拷贝构造,编译器不会为我们定义默认的移动构造
  7. 如果没有移动操作,我们实际使用的是拷贝操作
折构
  1. 对于动态new分配的基类的指针,当delete时,会调用构造函数,但是在继承体系中,一个基类指针为动态类型,因为它可以指向派生类对象,
  2. 那么如果想要执行正确版本(派生类)的折构函数,需要将基类的折构函数声明为virtual
  3. 否则如果一个基类的折构函数不是virtual,则delete指向派生类对象的基类指针将产生未定义行为
  4. //
  5. 如果一个类定义了虚折构函数,则派生类中无论默认的还是自定义的都为虚折构函数
  6. 如果一个类定义了虚折构函数,则不一定需要拷贝和赋值操作
  7. 如果一个类定义了折构函数,则不会为这个类合成移动操作
  8. 当执行基类的折构函数时:执行顺序从派生类开始,逐层向上,直至继承链的最顶端(在构造中一个派生类包含上层的所有直接间接基类,树中的一条自底向上的路径,所以销毁直至最顶端)
  9. 折构函数不需要显示调用派生类的,它会隐式销毁派生类自己的成员,还会自动的隐式销毁直接基类的成员……

这篇关于名字查找、拷贝控制操作与继承体系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107643

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

MySQL——表操作

目录 一、创建表 二、查看表 2.1 查看表中某成员的数据 2.2 查看整个表中的表成员 2.3 查看创建表时的句柄 三、修改表 alter 3.1 重命名 rename 3.2 新增一列 add 3.3 更改列属性 modify 3.4 更改列名称 change 3.5 删除某列 上一篇博客介绍了库的操作,接下来来看一下表的相关操作。 一、创建表 create

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、