woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

Virtual / 虚函数之一、二、三、四......


1、真正意义上的虚函数调用,是运行时绑定的;
2、什么是真正意义上的虚函数调用?通过指针或者引用执行虚函数;
3、通过对象执行虚函数会不会是动态绑定的?不会。
4、一个类是否有虚函数,就看它是否包含一个指向虚函数表的指针;
5、如果类本身含有virtual 声明的函数,或者继承了virtual 函数,那么它肯定会包含一个指向虚函数表的指针;
6、从纯抽象类或者非抽象类继承了virutal,意义上是一样的,效率上是一样的,并不因为你是纯抽象类的继承而效率变高;
7、虚函数调用比普通函数调用慢多少?假设这个函数仅执行 return i  > j,大概慢 15%左右(3000万 * 100次规模测试),如果是个真正有意义上的函数,效率影响可以忽略不计;
8、因此说虚函数慢的基本上是放屁,担心虚函数影响效率的基本上是杞人忧天;
9、虚函数会慢,但是那是对内联函数而言的,虚函数会忽略 inline前缀,请注意这一点;
10、继承层次不影响虚函数效率,如果你这个类是原始类的第10层继承,那么虚函数调用效率和第1层继承的类没有差别,当然如果你要在该函数中调用上一层的虚函数那就另当别论了;
11、每个类应该只有一个virtual table,而不是每个对象有一个(对象只含有指向虚表的指针),那些说虚函数增大空间开销的可以自宫了;
12、如果一个类含有虚函数,在构造时,使用memset(this, 0, sizeof(*this))是找死的行为;
13、虚函数是运行时多态,模板是编译时多态,一个动,一个是静。

其他特性请读者补充。

posted on 2008-04-01 21:29 肥仔 阅读(2667) 评论(5)  编辑 收藏 引用 所属分类: C++ 基础

评论

# re: Virtual / 虚函数之一、二、三、四......  回复  更多评论   

楼主写得太好了。
补充一点吧:
·子类覆盖父类的虚函数的时候,实际上是在构造函数中修改了虚表中的函数指针;因此使得 FatherClass* p = new ChildClass();的情况下,p->VirtualFunc()始终执行的是子类的虚函数;


楼主请再发一篇吧,说说虚继承。
1、虚继承的时候,对象内部是否会存在一个以上的虚表指针?
2、虚继承中,子类调用父类的虚函数,是动态还是静态(是否通过虚表)?
3、可以谈谈COM原理与虚表的异同;

2008-04-02 13:16 | 阿福

# re: Virtual / 虚函数之一、二、三、四......  回复  更多评论   

用过c回调的人,就知道这是怎么回事儿了。
2008-04-02 22:19 | aGAric

# re: Virtual / 虚函数之一、二、三、四......  回复  更多评论   

第11点不认同,可以有多个虚表
2008-04-10 09:01 | red22

# re: Virtual / 虚函数之一、二、三、四......  回复  更多评论   

第11点不准确因该,多继承的时候可能多个虚函数指针,也指向多个虚表
2008-04-18 16:56 | mark

# re: Virtual / 虚函数之一、二、三、四......  回复  更多评论   

顶, 我正在大量使用虚函数
2008-10-17 14:37 | 123

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理