https://www.jb51.cc/csharp/1192770.html

编程之家收集整理的这篇文章主要介绍了详解C++虚成员函数和动态联编编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

推荐学习: 《c++教程》

——编译器对非虚方法使用静态联编(编译时匹配),对虚方法使用动态联编(运行时匹配)。

静态联编比动态联编效率高。

效率

为使程序能够在运行阶段进行决策,必须采取一些方法来跟踪基类指针或引用指向的对象类型,这增加了额外的处理开销。因此下列情况更适合静态联编:

因此静态联编被设置为C++的认选择。

如果要在派生类中重新定义基类的方法,则将它设置为虚方法;否则设置为非虚方法

编译器处理虚函数方法是:给每个对象添加一个隐藏成员。隐藏成员中保存了一个指向·函数地址·数组的指针。这种数组被称为虚函数表(vtbl),表中存储了为类对象进行声明的虚函数的地址。

派生类对象将包含一个指向独立地址表的指针(即新创建一个表)。(增加内存开销)

调用函数时,程序将查看存储在对象中的vtbl地址,然后转向相应的函数地址表并在表中查找地址。(影响执行速度)

总之,使用虚函数将在内存和执行速度上有一定的成本;即使非函数的效率比虚函数稍高,却不具备动态联编功能

析构函数应当是虚函数,除非类不用做基类。

友元函数不能是虚函数,因为友元不是类成员,而只有成员才可以是虚函数