一、纯虚函数和抽象类

那何为纯虚函数,何为抽象类呢?

1.1 纯虚函数

在虚函数的后面写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义因为要被派生类重写,但是语法上可以实现),纯虚函数只要声明即可。

纯虚函数也可以实现定义部分:

1.2 抽象类

我们先来看看什么是抽象?

抽象派画作:

就是某种程度说这个东西想表达的意思就是跟现实世界不对应,他不在现实世界中对应某一实体,不对应某个实体就不能实例化出对象

包含纯虚函数的类叫做抽象类,抽象类不能实例化出对象,如果派生类继承后不重写纯虚函数,那么派生类也是抽象类,派生类也不能实例化出对象

这是为什么?

如果派生类继承后不重写纯虚函数,派生类也是抽象类,纯虚函数某种意义上强制派生类重写虚函数,因为不重写就实例化不出对象。

  • 抽象类不能实例化出对象:

  • 派生类继承后不重写纯虚函数,派生类也是抽象类

  • 派生类继承后重写纯虚函数,派生类就不是抽象类,就可以实例化出对象

那既然抽象类不能实例化出对象,为什么还要搞这个呢?

抽象类不能实例化出对象,但是可以定义指针,抽象类的指针可以指向派生类对象

  • 总结:

纯虚函数适用于:

  1. 要强制派生类中重写这个虚函数,实现多态
  2. 基类中确实就是有些不想被实例化出对象的一些抽象的类别

ok,接下来,我们来看一道题:

下面编译为32位程序的运行结果是什么(D)

A. 编译报错 B. 运行报错 C. 8 D. 12

也许会有很多小伙伴会有疑惑?为什么是12呢?不应该是8吗?

ok,这就需要我们对多态的底层有一定的了解——

二、多态的原理
2.1 虚函数表指针

当我们运行上面题目中的代码时,会发现b的成员好像不止两个——

除了_b和_ch成员外,还有一个_vfptr,_vfptr是什么🤨?

ok,其实_vfptr是一个指针,对象中的这个指针我们叫做虚函数表指针(简称虚表指针),本质上是一个指针数组(虚函数指针数组)

当一个类里面有虚函数的时候,那这个对象中就会多一个指针,这个指针(_vfptr 虚函数表指针)会指向一张表 --> 指向一个数组,数组中存放的是虚函数的地址!!



 

更多推荐