在ATL或者WTL中,定义类的时候经常看到如下写法:
class CAboutDlg : public CStdDialogImpl {}
今天看了一篇文章才知道这么写的妙处,以前用的不多,也没有深究,惭愧。C++真的博大精深,奥妙无穷。
一般的C++程序对虚函数的支持都是通过虚函数表在运行时处理,ATL中这样的写法通过模板在编译时不用虚函数表就处理了,示例:
#include "stdafx.h"
#include "iostream"
using namespace std;
templateclass bclass
{
public:
void class_say()
{
T * p = static_cast(this);
p->print_class_name();
}
public:
void print_class_name()
{
cout << "This is bclass" << endl;
}
};
class dclass1 : public bclass
{
// No overridden functions at all.
};
class dclass2 : public bclass
{
public:
void print_class_name()
{
cout << "This is dclass2" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
dclass1 d1;
dclass2 d2;
d1.class_say();
d2.class_say();
return 0;
}
以上代码的精妙之处在T * p = static_cast(this)这句,其他的没什么难理解的。
阅读(1235) | 评论(0) | 转发(0) |