读书人

为何ATL的实现类都要声明_declspec(no

发布时间: 2013-09-06 10:17:17 作者: rapoo

为什么ATL的实现类都要声明__declspec(novtable)?

class ATL_NO_VTABLE CFun :.....


ATL工程创建的实现类都是上面这样的形式。奇怪了,既然ATL类的函数都是virtual的,为什么类型声明还要弄成novtable的呢? 这样做到底有什么含义和用途?

[解决办法]
atl类本身是没有IUnkonwn接口的实现,也无法new,虚表没啥意义,而且多占了点内存。
跟virtual不冲突
[解决办法]
__declspec (novtable)是操作虚表的关键字
曾经写过一个博客:http://blog.csdn.net/daisy__ben/article/details/8124789大概看看具体有几个地方不对。
1> 被这个关键字指定的类,虚表没有初始化,所以不能直接实例化(new),ATL框架部分可能是想限制在代码中直接使用new出类的实例(用其它的方法)。
2> 继承多个接口的组件,返回给客户的每个接口的指针都是相同(自己实验一下?应该是这样的)。普通类的多重继承内存布局可能不同于组件的虚表,多亏这个关键字,具体说清楚又几百字可以写博客了。

读书人网 >VC/MFC

热点推荐