首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于virtual.该如何处理

2012-03-09 
关于virtual..今天看一本书上说:作为一条经验,要把所有的方法都用virtual声明(包括析构函数,不包括构造函

关于virtual..
今天看一本书上说:作为一条经验,要把所有的方法都用virtual声明(包括析构函数,不包括构造函数),来避免因遗漏关键字virtual而产生的相关的问题。

这样全部用virtual声明有什么影响?比如对性能什么的。。。。。

[解决办法]
增大了开销,由于要查找虚表,减小了执行速度。
[解决办法]

C/C++ code
class Base{   virtual void f()=0;};class Derived:public Base{   /*virtual*/void f(){...};};
[解决办法]
特性的好坏完全看使用者。

在需要使用类似Init的时候如果你去virtual反而容易出乱子。
不过如果析构不用virtual,乱子更大。

坏处就是1L说的,增加了开销,因为使用virtual意味着一个virtual function table的形成,这张表本身就是一些函数指针,消耗还好,但是每次访问virtual函数都会多一次的指针跳转,因为需要在vft中进行查找,再跳转。(一般编译器优化后也就多一次跳转,查找都省掉了。)慢也就慢那一下,如果这个消耗你觉得吃不消,那还是用纯C好了。

好处的话就很多了,正因为它的存在,才使得C++可以面向对象。C实现C++无非就是自己来走这一步而已。
[解决办法]
探讨
引用:
增大了开销,由于要查找虚表,减小了执行速度。

岂不是 用virtual 反而不好了?

[解决办法]
都用虚函数不好,MFC中的消息机制没有用虚函数!!用虚函数就会建立虚表,这样占用内存。
[解决办法]
适度使用virtual,如果有可能改写或者覆盖某个函数的话,就用virtual,如果不需要,就不用。
[解决办法]
在多重继承时候用virtual多些!牵连到多态问题!
一般情况下用的不多吧!
[解决办法]
注意继承的时候子类析构不被调用。

热点排行