C++虚函数

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++ 中文版
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容