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

在ATL中,为什么要把派生类的名字传给基类模版?解决方法

2012-03-02 
在ATL中,为什么要把派生类的名字传给基类模版?在ATL中,为什么要把派生类的名字传给基类模版?比如:classATL

在ATL中,为什么要把派生类的名字传给基类模版?
在ATL中,为什么要把派生类的名字传给基类模版?
比如:
class   ATL_NO_VATABLE   CProp   :   pulic   CComCoClass <CProp,   &CLSID_Prop> ,   ....

[解决办法]
这个需要对模版有点了解了吧。
小的我对模版了解还好,
CComCoClass <CProp

看Inside ATL,这个地方我记得是为了COM的厂类做工作的。

从描述上,我觉得最好别说是传递给父类,这个要理解他们的编译顺序了。

[解决办法]
这个是ATL的规范吧

LZ去寻一份深入解析ATL之类的书,了解一下ATL的原理吧

有些东西还是自己花点时间有好处
[解决办法]
楼上的没一个说到点上。

楼主问为什么要把派生类的名字传给基类模版,解决这个问题最好的办法就是:

1,找到基类的源代码(ATL提供源代码的),拷贝出来;

2,将放置派生类名字的地方,如CComClass的第一个模板参数“class T”,替换为派生类的名字;

3,重新审视修改后的CComClass,源代码能看懂吧?看懂之后自然知道为什么了。

同样的办法,可以用来对付微软SDK里大量的宏,MFC、ATL都有写大量宏的毛病。如果像知道一个宏到底是干什么的,怎么运作的,那么就把宏的源代码找到,拷贝出来,展开在你的类里面,再重新审视一遍即可。

侯老师说,源码面前,了无秘密。
[解决办法]
静态多态,基本上都是这样用的.
template <class T>
struct base
{
void DO()
{
T* p = static_cast <T*> (this);
p-> call();
}
};
template <class T>
struct Do//假设有几种 Do类似的类,都有一个call成员函数
{
void call()
{.....
do something
}
};
strcut test:public base <test> ,public Do <test>
{
}
strcut test:public base <test1> ,public Do2 <test>
{
}
这样只需要搭配不同的Do类就能搭配出一个完全不同的类.
[解决办法]
如果还不大明白的话看 < <C++设计新思维> >
里面讲的很清楚
[解决办法]
一个小花招,用来模拟虚函数的功能。

请思考这个问题,怎么让基类的函数优先call到子类的重载函数?这点对类库的写作很重要,
因为类库使用者提供了具体的实现,基类当然要优先考虑子类的。答案就是虚函数

//伪码
class Base
{
public:
void interface_fuction()
{
real_fuction();
}
protected:
virtual void real_fuction() //不申明virtual那么即便子类有real_fuction()
//基类的interface_fuction调用不到。
{
...
}
}

重所周知,这样会有一定的消耗,还有没别的方法?有

void interface_fuction()
{

pDirived-> real_fuction(); //pDirived为继承类指针,这样优先也能call到
//子类的real_fuction(); 前提是需要知道子类
//的类型信息,于是模版就来了
}


T* pDirived = static_cast <T*> (this); //T为子类类型信息

热点排行