虚函数和多态

2016年04月17日

1 引入:继承和派生

  • 继承:在定义一个新类B时,若B拥有A的全部特点,则把A作为一个基类,把B作为基类的一个派生类(或称为子类)。
  • 定义:class 派生类名:public 基类名 { //code };

1.1 派生类的构造函数

调用派生类时先执行基类的构造函数

派生类初始化:

构造函数名(形参表):基类名(基类构造函数实参表){}

派生类构造函数中省略基类构造函数时,将自动调用基类构造函数

1.2 public继承赋值兼容规则

定义一个基类对象 base b和一个派生类对象 derived d:

  • 派生类对象可赋值给基类对象 (b = d)
  • 派生类对象可初始化基类引用 (base &br = d)
  • 派生类对象地址可赋值给基类指针 (base *pb = &d)

2 虚函数及多态

2.1 虚函数的定义

类定义里,前有 virtual关键字的成员函数称为 虚函数(构造函数和静态成员函数不能是虚函数)

2.2 多态的表现形式

  • 1、<派生类的对象地址可以赋值给基类指针> 通过基类指针调用基类和派生类中的同名虚函数时,若该指针指向一个基类对象(派生类对象),那么被调用的是基类(派生类)虚函数。
  • 2、<派生类的对象可以赋值给基类引用> 通过基类引用调用基类和派生类中的同名虚函数时,若该引用引用的是一个基类对象(派生类对象),那么被调用的是基类(派生类)虚函数。 下面以一个简单的例子来说明:

2.3 多态实现原理

  • 动态联编
  • 虚函数表 每一个有虚函数的的类(及其派生类)都有个虚函数表。该类任何对象中都存放着虚函数表的指针
  • 目的:提高程序的可扩充性(但有额外空间时间上的开销,主要体现在每个对象多4个字节存储以及查虚函数表上)

2.4 虚拟析构函数