首页 > 编程语言 >C++的继承和多态

C++的继承和多态

时间:2024-10-27 14:21:07浏览次数:3  
标签:调用 函数 继承 子类 多态 C++ 父类 重写

继承

继承的本质意义是复用(不用写就有)

父类的某些东西可以直接使用

eg.

但是注意 : 被继承的成员是新的成员,不是共用同一个成员(实例化的成员变量不同)

                 但是调用的函数是同一个函数

继承基类成员访问方式的变化(重点)

private访问

 " 在派生类中不可见 " 的意思是 : 不管类外还是类里面都不能访问

(自己的访问限定符private是类外面不能用,但是类里面可以用)

private的本质是不想被子类继承(不能被子类访问)

父类的私有对子类不可见

但是,子类可以间接使用父类的私有,即调用父类的成员函数来间接使用

基类和派生类的赋值兼容转换

对于基类和派生类而言,与一般的类型转换不同,转换中间不会产生临时变量

基类和派生类的赋值兼容转换只限于公有继承(父类有的子类都有)

转换规则

继承中的作用域

目前学过的域及其作用:

这里fun的关系是隐藏(函数重载的前提是在同一个作用域,但是两个fun在不同类域)

派生类的构造,析构和拷贝

子类的内置成员根据编译器来判断将内置类型变为0还是不处理

子类的自定义成员调用自定义类型的构造

将父类看作一个整体去调用父类的构造(把整个父类当作一个成员),但是只能调用父类的默认构造

构造函数初始化时是先初始化父类再初始化子类

析构的时候一定要先子后父

友元和静态成员

友元关系不会被子类继承

单继承和多继承

但是多继承存在一定的问题

eg.

多继承的二义性和数据冗余

会产生数据冗余和二义性的多继承也被叫做菱形继承

为了解决数据冗余,C++多加了一个关键字virtual

即使用虚继承

虚继承的底层

但是实践中最好避免使用菱形继承

继承和组合

eg.

尽量优先使用对象组合而非类继承

如果符合is-a关系就用继承

否则就用组合,来降低耦合度,方便维护代码

多态

虚函数

虚函数的重写

子类中有一个与基类完全相同的函数(父类的该函数为虚函数),称子类的虚函数重写了基类的虚函数

( 普通的函数相同构成隐藏 )

注意:只要父类的该函数是虚函数,子类进行重写,就符合虚函数的重写(重写就是特殊的隐藏)

注意 : 重写只会重写函数的实现 , 不影响函数的参数的缺省值

普通调用(看函数内部的代码调用的是谁的函数)

多态调用(根据函数传入的参数的类型不同来选择不同的函数)

例外

c++对析构函数进行了特殊处理,将析构函数的名称统一为destructor

这样就自然符合了多态,避免了析构函数调用错误

eg.

上述情况如果没有多态,就会导致Student开的空间却调用person的析构函数

override和final

override可以检查虚函数是否被重写

final可以用于修饰虚函数,使他无法被重写

重载 , 覆盖(重写) , 隐藏(重定义)的区别

抽象类和纯虚函数

eg.

多态的原理

虚函数表

含有虚函数的类中至少有一个指针, 用来指向虚函数表, 虚函数表中存储着类中的虚函数的地址

虚表的本质是一个函数指针数组, 虚表的地址存放在对象的前四个字节(不同的对象共享同一个虚表)(虚表存在于常量区代码段)

可以通过强制类型转换来获取虚表的地址

eg.

多态调用的原理就是 : 动态确认地址(运行时确定地址) (动态绑定)(根据给的参数不同来调用对应的参数), 根据传入的对象类型进入虚表中查找地址并调用

但是普通函数是静态绑定(无论给的参数是什么都只调用原函数)

eg.

对于多态,基类存在func1, func2两个虚函数,会将两个虚函数存在虚函数表中

派生类对func1进行重写,同样会将虚函数存入虚函数表,但是会将func1的地址换成重写过后的地址,而func的地址不变

标签:调用,函数,继承,子类,多态,C++,父类,重写
From: https://blog.csdn.net/2301_80006788/article/details/140272613

相关文章

  • C++11新标准の右值引用
    一、什么是左值、右值?专业的说法:左值是指表达式结束后依然存在的持久化对象;右值是指表达式结束后就不再存在的临时对象。通俗的说法:有名字的对象都是左值,右值没有名字。区分左右值得便捷方法:看能不能对表达式取地址,如果能,则为左值,否则为右值Tips:C++11把右值分为纯右值和......
  • Chromium127调试指南 Windows篇 - 安装C++扩展与配置(五)
    前言在前面的文章中,我们已经安装了VisualStudioCode(VSCode)并配置了基本的扩展。现在,我们将进一步优化我们的开发环境,重点关注C++相关的依赖扩展。这些扩展对于在VSCode中高效开发和调试Chromium项目至关重要。此外,我们还将学习如何使用gn工具生成VisualStudio2022的项目......
  • CSP/信奥赛C++刷题训练:经典二分例题(2):洛谷P1678:烦恼的高考志愿
    CSP/信奥赛C++刷题训练:经典二分例题(2)烦恼的高考志愿题目背景计算机竞赛小组的神牛V神终于结束了高考,然而作为班长的他还不能闲下来,班主任老t给了他一个艰巨的任务:帮同学找出最合理的大学填报方案。可是v神太忙了,身后还有一群小姑娘等着和他约会,于是他想到了同为计......
  • C++中decltype关键字用法总结
    目录一、前言二、基本用法及示例 三.推导规则四.decltype与typeid的区别五.decltype与std::decay的关系六.总结一、前言        decltype是C++11新增的一个关键字,和auto的功能一样,用来在编译时期进行自动类型推导。引入decltype是因为auto并不适用于所有......
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——15.C++11(1)
    1.自动类型推导(auto)C++11引入了auto关键字,可以根据初始值的类型自动推导变量的类型,从而减少了手动声明类型的繁琐。例如:std::vector<int>vec={1,2,3,4};autoit=vec.begin();//自动推导类型为std::vector<int>::iteratorauto的引入使代码更加简洁......
  • C++ -stack、queue
    博客主页:【夜泉_ly】本文专栏:【C++】欢迎点赞......
  • 为什么 C++ 能够源码级兼容C语言
    ##为什么C++能够源码级兼容C语言在探讨C++为何能源码级兼容C语言的问题时,我们首先需要明确一点:C++设计之初,就将与C语言的兼容性作为核心目标之一。这种兼容性主要体现在两个方面:语法和库函数。简而言之,C++保留了C语言的语法结构和大部分库函数,同时引入了面向对象编程、泛型编......
  • 7.C++数组
    C++数组1.数组1.数组在C++中,数组是一种存储固定大小的相同类型元素的序列。数组的所有元素都存储在连续的内存位置上。这种数据结构非常适合于存储具有固定数量和相同数据类型的元素集合。声明数组声明数组的基本语法如下数据类型数组名[数组大小];声明一......
  • 每日OJ题_牛客_城市群数量_FloodFill_C++_Java
    目录牛客_城市群数量_BFS/并查集题目解析C++代码Java代码牛客_城市群数量_BFS/并查集城市群数量_牛客题霸_牛客网(nowcoder.com)描述:        给定一个n个节点的邻接矩阵m。节点定义为城市,如果a城市与b城市相连,b与c城市相连,尽管a与c并不直接......
  • C++/CLI使用Office.Interop库创建excel,同时解决写入速度慢的问题
    boolWriteExcelFile_OfficeInterop(String^path,DataSet^dt, conststd::vector<std::string>&sheetName,boolhideColumnName) { //Ifthefilealreadyexists,deleteitandthengeneratefile if(System::IO::File::Exists(path)) { try......