使用模板实现多态性
来源:互联网 发布:安知玉如意男主 编辑:程序博客网 时间:2024/06/05 23:51
在C++中我们一般采用虚函数的方式实现函数的多态性,实现运行期绑定。
实际上我们也可以用模板来实现函数的多态性,这在ATL中大量使用的,请看如下的代码:
模板实例化:
在实例化时,模板类接受了一个特殊的模板参数:派生类 的名字,我们还可以发现,在使用中将基类的指针强制转换成派生类的。这正是通过模板来实现多态性的地方,因为编译器在实例化派生类的同时展开基类的代码所以,因此,这是一个完全安全的向下转换,因此在编译时候,编译器就可以模板中的函数地址指向派生类的成员函数了,这样的优势是节省了虚函数表空间和查表时间。
但这样也有个不好的地方是,破坏了“封装性”,父模板需要知道实例化类的方法,增加了耦合性(比如如果string类没有实现compare方法,则在编译器只能提示找不到compare方法,而不是提示string类应该实现compare方法),如果能够增加一个类似于纯虚函数的东东,只是负责让编译器进行编译期检查,并不实现虚函数就可以避免这样的问题了。
btw:这时ATL开发组“偶然”发现的一个特性,从一个侧面证明了泛型编程的强大和高效。不过这种仿动态绑定的方法只是用了c++标准和编译器的一个trip,因此在移植代码时需要谨慎考虑这种方法。
实际上我们也可以用模板来实现函数的多态性,这在ATL中大量使用的,请看如下的代码:
template<typename T,typename Deriving>
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];
};
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];
};
class String : public Array<char,String>{
public:
int Compare(const Array<char,String>& rhs)
{return strcmp(m_rg,rhs.m_rg);}
};
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++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数实现类的静态多态性
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数实现类的静态多态性
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数实现类的静态多态性及动态继承
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数实现类的静态多态性及动态继承
- 利用C++模板,代替虚函数实现类的静态多态性及动态继承
- 利用C++模板,代替虚函数,实现类的静态多态性
- 多态性实现机制剖析
- java实现多态性一
- java实现多态性二
- C++实现多态性
- showModalDialog 和open.window的不同
- Dealing with Adversity
- Ajax open 用法
- 爱情中的四个精致和残忍
- 为树节点(TreeNode)添加右键菜单
- 使用模板实现多态性
- Ajax - 基础教程第八章例子学习四
- 奔向成功的十个好习惯--希望能成为自己的警钟!
- 游戏中 ----三维空间中的 向量
- 网站验证码的技术原理和实例解析
- 有关UNICODE、ANSI字符集和相关字符串操作的总结!
- DWR变量未定义错误
- vc++中各种字符串的表示法
- C# 语法学习笔记