Virtual虚函数

2017-10-11

虚函数通过virtual关键字来声明。
C++中多态分为静态多态,和动态多态。
####静态多态 静态多态也称为静态绑定或早绑。编译器在编译期间完成的, 编译器根据函数实参的类型(可能会进行隐式类型转换) , 可推断出要调用那个函数, 如果有对应的函数就调用该函数, 否则出现编译错误。
体现在函数重载和泛型编程。
####动态多态(虚函数) 在程序执行期间(非编译期) 判断所引 用对象的实际类型, 根据其实际类型调用相应的方法。使用virtual关键字修饰类的成员 函数时, 指明该函数为虚函数, 派生类需要重新实现, 编译器将实现动态绑定。
体现在虚函数。

父类引用指向子类对象且子类重写了父类的函数时,如果不使用virtual关键字修饰函数,那么最终调用的函数还是父类的函数。解决这个问题需要在父类函数添加virtual关键字(虚函数)

构造函数不能使用virtula关键字修饰。
原因:虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初 始化,将无法进行。

静态函数不能使用virtual关键字修饰。
原因:static成员不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义的。static函数没有this指针,并且不会进入虚函数表。

友元函数不能使用virtual关键字修饰。
原因:因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。

一般建议父类的析构函数定义为虚函数。
原因:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。

####纯虚函数
virtual void function() const = 0
存在纯虚函数的类不能被实例化(等同于java中的抽象类)。
只存在纯虚函数的类等同于java中的接口。

描述

这是一个私人博客,记录平时的一些技术积累。

关于我

Email: 13073134757@163.com
GitHub: LinuxparaChen
© 主题借鉴Papyrus 原著作者:Hugo Sereno Ferreira. 原著主题.
Modify by LinuxparaChen.