C++

C++

[TOC]

多态

虚函数

virtual ReturnType FunctionName(Parameter)

第一行为虚函数,第二行为纯虚函数。定义虚函数的目的时允许用基类的指针来调用子类的这个函数

虚函数的作用主要是实现多态。基类定义虚函数,然后子类重写该函数。在子类重写该函数的时候,需要申明该函数为虚函数。

动态联编:父类指针指向子类对象的地址,动态调用子类的重写的虚函数,且这样的调用发生在运行阶段,不是编译阶段,称为动态联编。

纯虚函数

virtual ReturnType FunctionName(Parameter) = 0

基类中声明的虚函数,且在基类中无定义,但所有的派生类都需要定义这个纯虚函数的实现方法

纯虚函数出现的原因:

  • 为了方便使用多态,我们常常需要在基类中定义虚函数
  • 很多情况下,基类本身生成对象是不合情理的。

声明了纯虚函数的类是一个抽象类。我们不能创建抽象类的对象,只能创建其子类的对象。

纯虚函数最显著的特征:必须在继承类中重新声明,且其在抽象类中无定义。

定义纯虚函数的目的:使派生类仅仅只是继承函数的接口

无法被声明为虚函数的例子

  • 静态成员函数
  • 类外的普通函数
  • 构造函数
  • 友元函数

Q1:为什么类的构造函数不能是虚函数

构造函数是用来构造对象的,调用构造函数的时候必须知道是谁调用了构造函数。

Q2::为什么类的静态成员函数不能是虚函数

静态成员函数是该类公用的,与该类对象无关,且静态函数内部无this指针,所以

Q3:为什么内联函数不能是虚函数

友元函数与该类无关,无this指针

为什么基类会有虚析构函数

防止内存泄露

如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行了释放。假设基类中采用是非析构函数,当删除其基类指针指向的怕派生类对象时就不会触发动态绑定,因为只调用基类的析构函数,而不会调用派生类的析构函数。那么派生类中申请的空间就得不到释放而产生内存泄漏。所以C++中基类的析构函数应该采用虚函数模式

JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里只属于前端工程师。