模板多态
来源:互联网 发布:品茗软件下载 编辑:程序博客网 时间:2024/06/03 05:07
实际上我们也可以用模板来实现函数的多态性,这在ATL中大量使用的,请看如下的代码:
class Array...{
public:
bool operator< (const Array<T,Deriving>& rhs)
...{return static_cast<Deriving*>(this)->Compare(rhs) < 0;}
bool operator> (const Array<T,Deriving>& rhs)
...{return static_cast<Deriving*>(this)->Compare(rhs) > 0;}
bool operator== (const Array<T,Deriving>& rhs)
...{return static_cast<Deriving*>(this)->Compare(rhs) == 0;}
protected:
T m_rg[1024];
};
public:
int Compare(const Array<char,String>& rhs)
...{return strcmp(m_rg,rhs.m_rg);}
};
在实例化时,模板类接受了一个特殊的模板参数:派生类 的名字,我们还可以发现,在使用中将基类的指针强制转换成派生类的。这正是通过模板来实现多态性的地方,因为编译器在实例化派生类的同时展开基类的代码所以,因此,这是一个完全安全的向下转换,因此在编译时候,编译器就可以模板中的函数地址指向派生类的成员函数了,这样的优势是节省了虚函数表空间和查表时间。
但这样也有个不好的地方是,破坏了“封装性”,父模板需要知道实例化类的方法,增加了耦合性(比如如果string类没有实现compare方法,则在编译器只能提示找不到compare方法,而不是提示string类应该实现compare方法),如果能够增加一个类似于纯虚函数的东东,只是负责让编译器进行编译期检查,并不实现虚函数就可以避免这样的问题了。
btw:这时ATL开发组“偶然”发现的一个特性,从一个侧面证明了泛型编程的强大和高效。不过这种仿动态绑定的方法只是用了c++标准和编译器的一个trip,因此在移植代码时需要谨慎考虑这种方法。
c++的模板是个很强很暴力的东西,可以轻松地模拟多态。下面举个例子:
====================================================================
#include <iostream>
#include <string>
using namespace std;
class StarDecorator//注意:与多态不同,不需要有类阶层(简单说不需要继承啥接口)
{
public:
};
class AddDecorator
{
public:
};
template<class Decorator>
class Printer
{
public:
private:
};
int main(int argc, char* argv[])
{
}
========================================
- 模板实现多态
- 模板多态
- 模板多态
- 模板的多态
- 模板实现多态
- 利用模板实现多态
- Day49、子类模板访问基类模板、模板型模板参数、嵌套模板的外部定义、“零”初始化、虚函数和多态、编译模型
- 使用模板来实现多态
- C++模板多态 ——Type2Type
- C++ Templates:模板的多态威力
- 模板和多态策略化加锁
- 实验7 多态与模板
- 多模板切换
- 多模板layout
- 多圆相交模板
- 多行模板字符串
- 模板
- 模板?
- 职业罗盘 认识你自己
- AVL 树高度和结点数的关系
- linux ipc—信号
- PostgreSQL 中简易 flushbuffer 模块正确添加和使用
- CityEngine与ArcGIS对栅格数据的要求情况
- 模板多态
- C# LINQ to XML
- WPF内嵌Flash并交互
- 自定义控件遇到的两个小问题
- C++虚函数的一点分析与思考
- ARM 架构是什么意思,还有其他的架构?
- python运算
- mac 下 SVN使用方法
- 更新Svn客户端后,右键菜单中没有TortoiseSVN了