Chinaunix首页 | 论坛 | 博客
  • 博客访问: 132317
  • 博文数量: 22
  • 博客积分: 698
  • 博客等级: 上士
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 09:53
文章分类
文章存档

2012年(2)

2011年(15)

2010年(5)

我的朋友

分类: C/C++

2011-01-27 14:38:20

在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)这句,其他的没什么难理解的。
阅读(1204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~