首页 > 其他分享 >虚函数与多态

虚函数与多态

时间:2024-04-18 12:46:00浏览次数:23  
标签:调用 函数 派生类 多态 纯虚 基类 抽象类

虚函数

  • 前有 virtual 关键字的成员函数
class base{
	virtual int get();
}
int base::get{}
  • virtual关键字只用在类的定义里的函数声明
  • 构造函数与静态成员函数不能是虚函数

多态

表现形式 一

  • 派生类的指针可以赋给基类的指针
  • 通过基类指针调用基类和派生类中的同名虚函数
    • 指向基类的对象,调用基类的虚函数
    • 指向派生类,调用派生类的虚函数

表现形式 二

  • 派生类的指针可以赋给基类引用

  • 通过基类引用调用基类和派生类中的同名虚函数

    • 引用的是基类的对象,调用基类的虚函数
    • 引用的是派生类对象,调用派生类的虚函数
  • 在非构造函数和非析构函数的成员函数中调用虚函数,就是多态

  • 在构造函数与析构函数中调用虚函数,在编译时即可确定,调用的函数时自己的类或基类中定义的函数

多态的实现

依靠动态联编

虚函数表

  • 每一个有虚函数的类都有虚函数表,该类的任何对象中都放着虚函数表的指针。
  • 4个字节

虚析构函数,纯虚函数和抽象类

虚析构函数

  • 把基类的析构函数声明为virtual
  • 通过基类的指针删除派生类的对象时,首先调用派生类的析构函数,然后调用基类的析构函数
    ![[Pasted image 20231227154139.png]]
    ![[Pasted image 20231227154156.png]]

纯虚函数和抽象类

纯虚函数:没有函数体的虚函数

class A{
	private: int a;
	public:
		virtual void Print()=0; //纯虚函数
		void fun(){cont<<"fun";}
}

抽象类:包含纯虚函数的类

  • 只能作为基类来派生新类使用,不能创建派生类的对象
  • 抽象类的指针和引用可以指向由抽象类派生出来的类的对象
    • A * pa;
  • 抽象类的成员函数内可以调用纯虚函数(不包括构造函数或析构函数)
  • 如果一个类从抽象类派生而来,那么当且仅当他实现了基类中所有的纯虚函数,他才能成为非抽象类

标签:调用,函数,派生类,多态,纯虚,基类,抽象类
From: https://www.cnblogs.com/AndyYX/p/18143283

相关文章

  • 构造函数与析构函数
    构造函数可以有多个,可以重载复制构造函数只有一个参数,即对同类对象的引用没有定义会生成默认复制构造函数Complex(constComplex&c){ real=c.real; imag=c.imag;}三种使用情况用对象去初始化同类的另一个对象Complexc2(c1);函数有一个参数是类A是的对象时......
  • 深入分析C++对象模型之移动构造函数
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。C++11新标准中最重要的特性之一就是引入了支持对象移动的能力,为了支持移动的操作,新标准引入了一种新的引用类型——右值引用,右值引用一......
  • 微信小程序中生命周期钩子函数
    微信小程序App的生命周期钩子函数有以下7个:   onLaunch(options):当小程序初始化完成时,会触发onLaunch(全局只触发一次)。   onShow(options):当小程序启动或从后台进入前台显示时,会触发onShow。   onHide():当小程序从前台进入后台时,会触发onHide。   onError(......
  • 第三节 函数的极限
    第三节函数的极限一、函数极限的定义  在自变量的某个变化过程中,如果对应的函数值无限接近于某个确定的数,那么这个确定的数就叫做在这一变化过程中函数的极限主要研究两种情形:(1)自变量x任意接近于有限值\(x_0\)或者说趋于有限值\(x_0\)(记作\(x→x₀\))时,对应的......
  • 函数重载
    1.什么是函数重载一组函数,其中函数名相同,参数列表的个数或者类型不同,那么这一组函数就称为函数重载一组函数要称得上重载,一定要在同一个作用域中。同一作用域#include<iostream>#include<cstring>usingnamespacestd;boolcompare(inta,intb){cout<<"in......
  • Effective Python:第5条 用辅助函数取代复杂的表达式
    初始代码: 第一次优化:多次使用:  ......
  • uniCloud云函数概述---云对象
    云对象是普通云函数的升级版,功能和云函数是一样的。它在大多数场景下替代了普通云函数。云对象是对象化的云函数,比如一个文章云对象,它可以包括文章的创建,文章的删除,文章的编辑等功能。(一句话描述云对象:等同于PHP后端部份) 一、创建云对象打开项目,找到uniCloud/cloudfuncti......
  • R语言函数速查
    R语言函数速查`ls()`:查看工作空间中的变量名字cat(,sep=)输出scan()输入rm()删除read.csv(file,encoding=’UTF-8)read.table(file,reader=T,sep=’’,stringAsFactor=T,encoding=’’)factor(data,levels=c(),labels=c())#NA不是levelsis.判断is.inf......
  • 深度解读《深度探索C++对象模型》之拷贝构造函数
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文。写作不易,请有心人到我的公众号上点点赞支持一下,增加一下热度,也好让更多的人能看到,公众号里有完整的文章列表可供阅读。有以下三种情况,一个类对象的初始......
  • element的表格页面宽度变化问题 (防抖函数)
      //表格问题(防抖函数) constdebounce=(fn,delay)=>{ lettimer=null; returnfunction(){ letcontext=this; letargs=arguments; clearTimeout(timer); timer=setTimeout(function(){ fn.apply(context,args); },delay); } } const_R......