首页 > 其他分享 >四、类和对象(五)

四、类和对象(五)

时间:2024-07-11 12:59:29浏览次数:12  
标签:函数 对象 子类 多态 抽象类 父类 纯虚析构

1.多态的基本概念

分为两类

静态多态:函数重载和运算符重载属于,复用函数名

动态多态:派生类和虚函数实现运行时多态

区别

静态多态的函数地址早绑定,编译阶段确定函数地址

动态多态的函数地址晚绑定,运行阶段确定函数地址

父类成员函数前面加virtual 叫做虚函数,就会实现动态多态

class Animal{ virtual  speak()};

class Cat:public Animal{ speak()};

class Dog:public Animal{ speak()};

动态多态满足条件

有继承关系

子类要重新写父类的虚函数(重写:返回值类型,函数名,参数表完全相同)

使用         用父类的引用或者指针执行子类对象

vsptr 虚函数(表)指针,指向一个虚函数表vftable

子类重写父类的虚函数时,子类中的虚函数表内部会替换成子类的虚函数地址

当父类的指针或者引用子类对象时,就会发生多态

2.多态的优点

代码组织结构清晰

可读性强

利于前期和后期的扩展和维护

开发中提倡开闭原则

对扩展进行开发,对修改进行封闭

3.纯虚函数和抽象类

在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容,因此可以将虚函数改为纯虚函数

语法  virtual 返回值类型 函数名 (参数表) = 0;

当类中有了纯虚函数,这个类也称为抽象类

抽象类特点

无法实例化对象(不能用这个类建立新的对象)   

子类必须重写抽象类中的纯虚函数,否则也属于抽象类

4.虚析构和纯虚析构

使用多态时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码

解决方法  将父类中析构函数改为虚析构或者纯虚析构

虚析构和纯虚析构

共性

可以解决父类指针释放子类对象

都需要有具体的函数实现

区别       

如果是纯虚析构,该类属于抽象类,无法实例化对象

纯虚析构函数需要声明,也需要在类外实现

有了纯虚析构,这个类也属于抽象类,无法实例化对象

虚析构语法 virtual ~类名(){}

纯虚析构语法  virtual ~类名()=0;//声明

              类名::~类名(){}  //实现

总结

虚析构或者纯虚析构就是用来解决父类指针在释放子类对象

如果子类中没有堆区数据,可以不写为虚析构或者纯虚析构

有了纯虚析构,这个类也属于抽象类,无法实例化对象

标签:函数,对象,子类,多态,抽象类,父类,纯虚析构
From: https://blog.csdn.net/weixin_62492456/article/details/140264445

相关文章

  • 【C++知识点总结全系列 (08)】:面向对象编程OOP
    这里写目录标题1、OOP概述(1)面向对象四大特征A.抽象B.封装C.继承D.多态(2)构造函数A.What(什么是构造函数)B.Why(构造函数的作用)C.Which(有哪些构造函数)(3)析构函数A.What(什么是析构函数)B.Why(析构函数的作用)(4)=default和=deleteA.WhyB.How2、继承(1)What(什么是继......
  • Java中类和对象概述
    目录前言:一.初步了解类和对象1.1什么是面向对象?1.2什么是类和对象?​二.类的定义与使用2.1类的格式与定义2.2对象的创建与使用 三.this关键字的使用3.1this的使用方法3.2this引用的特性 四.类的构造方法 五.静态变量和静态方法前言:小编也是第一次写blog,可能......
  • JVM是如何创建一个对象的?
    面试连环callJava对象创建的流程是什么样?JVM执行new关键字时都有哪些操作?JVM在频繁创建对象时,如何保证线程安全?Java对象的内存布局是什么样的?对象头都存储哪些数据?带着这些问题,让我们开始吧!......
  • Java面向对象小游戏--文字版格斗游戏(附带全套源代码)->基于JavaBean
    一、前言java部分的基础学习已经完结,接下来给大家分享的大多为java相关的案例分析,也会有一些小项目,这点不要太过于担心,主要还是基础部分要打牢固。java部分的难点就在面向对象这一点,学习C语言的小伙伴们应该是第一次听说方法。这点也是和C语言相差巨大的地方,不过对于学习过pyt......
  • Java面向对象基础篇综合训练(附带全套源代码及逐语句分析)->基于javabeen
    一、前言还是那句话面向对象是Java的重点,同时也是难点,小编会在此部分分享一些综合型的案例,难度从易到难,本篇文章只是一些基础的操作,综合能力并不是太高。大家可以试着观看一遍自己去打开编译器尝试一下。不知道有多少读者是跟着小编进行学习的,今天是学习Java的第五天,希望大家......
  • 面试官:Java对象引用都有哪些类型?
    哈喽,大家好......
  • Request对象
    目录DjangoRequest和参数1.属性1.1先学习下面向对象知识点DjangoRequest和参数1.属性1.1先学习下面向对象知识点获取对象中的成员时,本质上会调用__getattribute__方法,默认我们不定义就用父类中的classRequest(object):def__init__(self,req,xx):se......
  • JavaSE学习笔记第二弹——对象和多态(上)
    目录面向对象基础面向对象程序设计的定义类的基本结构成员变量成员方法方法定义与使用设计练习方法重载构造方法静态变量和静态方法String和StringBuilder基本含义区别总结今天我们继续来学习JavaSE,扩展和Java相关的知识,与大家共勉。今天的主题是对象和多态,希......
  • JVM是如何创建一个对象的?
    哈喽,大家好......
  • Simple WPF: WPF实现一个MINIO等S3兼容对象存储上传文件的小工具
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!目的之前在阿里云ECS99元/年的活动实例上搭建了一个测试用的MINIO服务,以前都是直接当基础设施来使用的,这次准备自己学一下S3兼容API相关的对象存储开......