为何ATL的实现类都要声明_declspec(novtable)
为什么ATL的实现类都要声明__declspec(novtable)?class ATL_NO_VTABLE CFun :.....ATL工程创建的实现类都
为什么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> 继承多个接口的组件,返回给客户的每个接口的指针都是相同(自己实验一下?应该是这样的)。普通类的多重继承内存布局可能不同于组件的虚表,多亏这个关键字,具体说清楚又几百字可以写博客了。