万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:
http://weibo.com/wanlianwen
C++博客
首页
新文章
新随笔
聚合
管理
posts - 172, comments - 1253, trackbacks - 0
动态多态与静态多态
动态多态通过继承+虚函数实现,静态多态通过模版实现。
动态多态看上去很自然清晰,除此之外怕是没有别的好处。这也是为什么stl、boost为一群语法高手所亲眯的原因。说实话经常一看到模版都打冷战,要是模版参数一多,理清之间关系就得化很多时间。不过某些地方,使用模版来实现一些底层功能能达到意想不到的效果。
静态多态的好处:
1、可以多态成员变量(自创的说法哦^_^)
2、避免虚指针的内存损耗以及虚函数调用运行效率损耗
缺点:
1、因为编译时会加入类型的确定,代码尺寸会稍稍大一点
2、无法对多态对象统一处理,多态性稍有折扣
MFC类很少使用模版,而WTL类大量使用模版。我在看WTL代码的时候,经常被里面的实现所迷惑,因为里面有很多设计采用动态多态和静态多态结合使用,这可能是一种不错的结合。下面我用一段代码演示这些特点,看上去很平常:
//
Virtual && inherit
class
Category1
{
public
:
virtual
void
SayCatName()
=
0
;
}
;
class
Car1 :
public
Category1
{
private
:
static
string
m_strName;
public
:
virtual
void
SayCatName()
{
cout
<<
m_strName
<<
endl;
}
}
;
string
Car1::m_strName
=
"
Car1
"
;
class
House1 :
public
Category1
{
private
:
static
string
m_strName;
public
:
virtual
void
SayCatName()
{
cout
<<
m_strName
<<
endl;
}
}
;
string
House1::m_strName
=
"
Hourse1
"
;
//
!(Virtual && inherit)
//
Template
template
<
typename T
>
class
Category2
{
protected
:
static
string
m_strName;
public
:
virtual
void
SayCatName()
{
T
*
pT
=
static_cast
<
T
*>
(
this
);
pT
->
SayCatName();
}
}
;
class
Car2 :
public
Category2
<
Car2
>
{
public
:
virtual
void
SayCatName()
{
cout
<<
m_strName
<<
endl;
}
}
;
string
Car2::m_strName
=
"
Car2
"
;
class
House2 :
public
Category2
<
House2
>
{
public
:
virtual
void
SayCatName()
{
cout
<<
m_strName
<<
endl;
}
}
;
string
House2::m_strName
=
"
House2
"
;
//
!(Template)
//
Virtual && inherit && Template
class
CategoryBase
{
public
:
virtual
void
SayCatName()
=
0
;
}
;
template
<
typename T, typename TBase
=
CategoryBase
>
class
CategoryImpl :
public
TBase
{
protected
:
static
string
m_strName;
}
;
class
Car3 :
public
CategoryImpl
<
Car3
>
{
public
:
virtual
void
SayCatName()
{
cout
<<
m_strName
<<
endl;
}
}
;
string
Car3::m_strName
=
"
Car3
"
;
class
House3 :
public
CategoryImpl
<
House3
>
{
public
:
virtual
void
SayCatName()
{
cout
<<
m_strName
<<
endl;
}
}
;
string
House3::m_strName
=
"
House3
"
;
//
!(Virtual && inherit && Template)
int
_tmain(
int
argc, _TCHAR
*
argv[])
{
//
test Virtual && inherit
Category1
*
pCatInstance
=
new
Car1();
pCatInstance
->
SayCatName();
delete pCatInstance;
pCatInstance
=
NULL;
pCatInstance
=
new
House1();
pCatInstance
->
SayCatName();
delete pCatInstance;
pCatInstance
=
NULL;
//
!(test Virtual && inherit)
//
test Template
Category2
<
Car2
>*
pCar2
=
new
Car2();
pCar2
->
SayCatName();
delete pCar2;
pCar2
=
NULL;
Category2
<
House2
>*
pHouse2
=
new
House2();
pHouse2
->
SayCatName();
delete pHouse2;
pHouse2
=
NULL;
//
!(test Template)
//
test Virtual && inherit && Template
CategoryBase
*
pBase
=
new
Car3();
pBase
->
SayCatName();
delete pBase;
pBase
=
NULL;
pBase
=
new
House3();
pBase
->
SayCatName();
delete pBase;
pBase
=
NULL;
//
!(test Virtual && inherit && Template)
return
0
;
}
里面体现了很多特性,有些例如静态函数的巧妙使用没有演示。
例子完全是本人臆想出来的,没有实际意义,仅从语法上去考虑。
posted on 2006-09-25 10:38
万连文
阅读(2687)
评论(3)
编辑
收藏
引用
所属分类:
模板
FeedBack:
#
re: 动态多态与静态多态
2006-09-28 09:48 |
pyrophile
模板个人觉得老外特别喜欢用,而在中国使用者甚少,不知道这是为什么?(是不是我寡闻了!),记得荣耀先生写过一篇关于讨论多态的文章,里面也讨论了动态多态和静态多态的特性,最后总结了说,要动态与静态的同时使用,达到同质与异质的同时运用,具体的例子可以到荣耀先生的主页去看。
回复
更多评论
#
re: 动态多态与静态多态
2006-11-27 17:21 |
sun
该用模板的VC已有,如Vector,list,link,array相近类型的都有,是你们自己不注意.真正编程那些已够了.其它用模板很多是得不偿失,这里有个平衡问题.
我们可作进一步讨论
sunbysj@sohu.com
回复
更多评论
#
re: 动态多态与静态多态
2012-11-23 11:07 |
大神
virtual void SayCatName()
{
T* pT = static_cast<T*>(this);
pT->SayCatName();
}
请问这个函数作用是什么? 貌似不会被调用到,如果调用到了则是无穷递归!
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
动态多态与静态多态
std::string一个极其隐晦得问题
C++ Template: The Complete Guide 学习-9 模板中的命名
C++ Template: The Complete Guide 学习-8.5后记
C++ Template: The Complete Guide 学习-8.4友元
能生成这个类的一个对象嘛???
一个模板巧妙技术,语法技巧
抑制模板代码膨胀的一种技术
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
简历下载
联系我
<
2006年7月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(66)
给我留言
查看公开留言
查看私人留言
随笔分类
.NET(6)
ACDK(6)
ATL(11)
MFC(29)
richedit(9)
WTL(1)
乱七八糟(61)
模板(8)
小作品(40)
随笔档案
2013年3月 (2)
2012年9月 (2)
2012年8月 (2)
2012年7月 (2)
2012年6月 (3)
2012年5月 (2)
2011年9月 (2)
2011年8月 (1)
2011年6月 (2)
2011年5月 (4)
2011年4月 (2)
2011年3月 (2)
2010年12月 (1)
2009年9月 (1)
2009年8月 (2)
2009年7月 (2)
2009年6月 (2)
2009年5月 (1)
2009年4月 (1)
2009年1月 (1)
2008年12月 (5)
2008年11月 (2)
2008年10月 (1)
2008年9月 (7)
2008年8月 (2)
2008年3月 (3)
2008年2月 (2)
2008年1月 (3)
2007年12月 (6)
2007年11月 (1)
2007年10月 (3)
2007年9月 (1)
2007年8月 (5)
2007年7月 (5)
2007年6月 (3)
2007年5月 (5)
2007年4月 (5)
2007年3月 (4)
2007年2月 (2)
2007年1月 (2)
2006年12月 (4)
2006年11月 (8)
2006年10月 (1)
2006年9月 (9)
2006年8月 (7)
2006年7月 (10)
2006年6月 (1)
2006年5月 (2)
2006年4月 (10)
2006年3月 (3)
2006年2月 (3)
2006年1月 (2)
2005年12月 (8)
相册
new
个人相册
搜索
最新评论
1. re: 用MFC实现WebGUI--(CDHtmlDialog)
前辈好,代码下载之后怎么用啊?我生成的exe打开是空白的页面,菜单新建不知道建的啥,打开一个html页面也没有反应,我的环境是vs2010
--王同林
2. re: 使MFC变漂亮一:MFC与Flash交互示例
能不能把Flash源文件共享一下,要不然Flash端变量不知道怎么操作
--ddd
3. re: 甘特图第一版本发布
你这个附件有什么功能限制?
--xrczld
4. re: 并行编程--MPI开发入门
我是用的vs+MPICH2,用wmpiexec运行我的exe的时候,不能连接到主机是什么鬼啊。。求回复
--M琨M
5. re: 基于Chrome开源提取的界面开发框架 三(.3)
豌豆荚非常不错的应用
--mmocake
阅读排行榜
1. 基于Chrome开源提取的界面开发框架开篇(32322)
2. 用MFC实现WebGUI--(CDHtmlDialog)(25906)
3. 并行编程--MPI开发入门(19129)
4. 使MFC变漂亮二:MFC与HTML交互示例(17357)
5. FreeType2研究(16077)
评论排行榜
1. 我把初恋搞丢了(原创)(55)
2. 一个小型绘图程序(45)
3. 并行编程--MPI开发入门(42)
4. 我得C++学习心得(41)
5. 用MFC实现WebGUI--(CDHtmlDialog)(40)