通过继承(inheritance)联系在一起的类构成一种层次关系。
基类中任何构造函数以外的非静态函数都可以是虚函数,关键字virtual
只能出现在类内部的声明语句之前而不能用于类外部的函数定义。
派生类构造函数
尽管在派生类对象中含有从基类继承而来的成员,但是派生类并不能直接初始化这些成员。和其他创建了基类对象的代码一样,派生类也必须使用基类的构造函数来初始化它的基类部分。
多态性(Polymorphism)
可以简单地概括为“一个接口,多种方法”,它是面向对象编程领域的核心概念。虚函数是实现多态的机制,其核心理念是通过基类访问派生类定义的函数。
动态绑定
函数的运行版本由实参决定,即在运行时选择函数的版本,可能基类也可以派生类的成员函数,动态绑定也被成为运行时绑定。动态绑定只有通过指针或引用调用虚函数时才会发生。
虚函数
当某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定应该调用哪个版本的函数,因此所有虚函数都必须有定义。
虚函数 纯虚函数 普通成员函数对比
虚函数:提供接口,并提供默认的实现方法,派生类也可以根据需要自己去重载;
纯虚函数:只提供一个接口,具体实现方法需要派生类自己去重载;
普通成员函数:提供接口以及强制的实现方法;
当使用类的指针调用成员函数时,普通函数由指针类型决定,而虚函数由指针指向的实际类型决定。
Override
C++11新标准允许派生类显式地注明它将使用哪个成员函数改写其基类的虚函数,具体措施是在该函数的形参列表之后增加一个Override
表明派生类函数覆盖基类虚函数。此外,如果派生类定义了一个函数与基类中虚函数名字相同但是形参列表不同,编译器将认为新定义的函数与基类原有的函数是相互独立的。
抽象基类
含有纯虚函数的类是抽象基类(abstract base class),抽象基类负责定义接口,派生类可以覆盖该接口。不能直接创建一个抽象基类的对象,可以定义派生类的对象,前提是派生类覆盖了抽象基类的接口。
纯虚函数
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加= 0
:
virtual fun( ) const = 0