1 解决什么问题
让基类指针可以调用派生类的函数,达到多态的效果。
设计抽象基类时,找出哪此操作行为与类型相关。
有哪些操作行为必须根据不同的派生类而有不同的实现方式。
这些操作行为应该成为整个类继承体系中的虚函数。
2 怎么使用
2.1 纯虚函数
virtual void test() = 0;
将虚函数赋值为0,则为纯虚函数,在派生类中必须定义该函数。
由于纯虚函数没有函数定义,该基类只能作为抽象类,并不能生成实例。
2.2 虚函数
virtual void test();
当基类定义了虚函数,如果派生类想覆盖基类所提供的虚函数,那么派生类重新定义即可。但函数原型必须完全符合基类所声明的函数原型,包括:参数列表、返回类型、常量性。
2.3 虚析构函数
virtual ~BaseClass();
一般基类定义有虚函数,析构函数也应该声明为虚函数。
当基类指针指向派生类实例,delete基类指针时,如果析构函数是虚函数,就可以将派生类的析构函数先执行,从而达到释放派生类占用的内存。
3 实现原理
编译器把一个virtual函数的名字转换为指向这些函数的指针表的一个下标。这种表通常被称为“虚函数表”,或简称vtbl。
定义了虚函数的基类或派生类,都会包含一个虚函数表;这些类的实例对象都会包含一个指针,而这个指针会指向对应类的虚函数表。
4 参考文献
文中内容大部分摘抄于以下文献
- C++程序设计语言(特别版)
- Essential C++ 中文版