c++的多态性
请大虾们解释'动态束定'在c++中的实现!为什么虚函数实现'动态束定'与c中的swich的'静态束定'有本质区别?
高分奉送!!
问题点数:90、回复次数:14Top
1 楼skymost(李天最)回复于 2002-04-12 23:20:53 得分 5
去看<<inside C++ object model>>Top
2 楼k_f(凡人)回复于 2002-04-13 01:45:50 得分 0
简单说,动态绑定是在运行时binding,静态绑定是在编译时binding。Top
3 楼arya(行者)回复于 2002-04-13 03:28:07 得分 10
dynamic binding可以看成一个动态的switch。它和静态的switch的共同点都是根据一个输入值决定流程的走向,而这个决定的规则和所有可能的走向在静态switch的情况下是编译时就决定了的,当程序编译好了,就无法改变了。而动态switch的意思是,走向是由输入值完全动态决定的。一些地址被预存在和对象关联的某处,当处理对象的时候,根据传来的对象的数据结构才能决定具体去哪。这个目的在编译期间是不为编译器所知道的。编译器也不关心这个。这就是动态switch。Top
4 楼yn_zyc_base(活着)回复于 2002-04-13 07:54:20 得分 5
用switch来理解dynamic binding,有点困难!!!switch也是根据得到的值不同,机动的去走不同的分支,那么dynamic binding中,也是看句柄引用实际对象来实行不现的操作???Top
5 楼coppermine(coppermine)回复于 2002-04-13 09:11:38 得分 20
静态绑定是指在编译时可就确定了被调用函数的地址,这有点像硬编码,
这样在程序运行时就只能调用编译时绑定的函数.
动态绑定是由于添加了一个中间层Vtbl,这是一个函数指针数组,编译时对函数的绑定是通过将vtbl的首地址加上一个偏移量来实现的.虽然调用一个同名虚函数时偏移量都是相同的,但是由于该位置上的函数指针可能指向不同的函数实现,于是形成了多态.
Top
6 楼mjm_d(菠萝蜜多)回复于 2002-04-13 21:27:59 得分 5
举个例子:
邮递员送信;
笨瓜1邮递员是为一封信每一家都去(不排除骗吃骗喝的可能)他就像switch
笨瓜1邮递员是看一封信的地址(虽然要自己读地址,但化不了多少时间)再去(排除在这一家大吃一顿的可能)他就像虚函数,地址写在vtable中
Top
7 楼Betta(小新)回复于 2002-04-15 10:28:06 得分 5
简单地说:
class ISome
{
public:
void Action()=0 ;
} ;
void MakeAction(ISome * p)
{
if(p != 0)
p->Action() ;
// Here, the compiler cannot decide what p->Action is
// linked, it's for runtime to caculate
}
class CSomeImplX
{
public:
void Action()
{
...
}
} ;
void main()
{
ISome * p = 0 ;
CSomeImpl oSome ;
p = oSome ;
MakeAction(p) ;
}
Top
8 楼Betta(小新)回复于 2002-04-15 10:29:31 得分 10
oh, sorry for typos:
简单地说:
class ISome
{
public:
void Action()=0 ;
} ;
void MakeAction(ISome * p)
{
if(p != 0)
p->Action() ;
// Here, the compiler cannot decide what p->Action is
// linked, it's for runtime to caculate
}
class CSomeImplX
: public ISome
{
public:
void Action()
{
...
}
} ;
void main()
{
ISome * p = 0 ;
CSomeImplX oSome ;
p = &oSome ;
MakeAction(p) ;
}
Top
9 楼hammer_shi(dmresearch)回复于 2002-04-15 10:49:12 得分 5
多态是针对重载而生的。当子类重载父类成员函数时会定义virtul,这样在变异的时候就会知道调用的是那各类成员函数。由于只有等到编译的时候才能知道属于哪个类,所以叫做:滞后联编。Top
10 楼zzyy()回复于 2002-04-15 11:33:20 得分 20
再补充一点:
switch属于静态绑定,在编译时方法头和方法体就被编译器关联在一起,在程序中由你定义的参数决定该调用哪个对象;
动态绑定则相对于静态绑定而言,是在程序运行期间由消息决定你调用哪个对象。具体来说就是多态性。首先你得定义一个基类,该基类在程序运行时候不被事例化。基类至少应该包含一虚函数,它只有函数头而没有函数尸体;另外还包含一Vtb(虚函数接口表),这是一个函数指针数组,编译时对函数的绑定是通过将vtb的首地址加上一个偏移量来实现的。。。(这部分 coppermine已经讲得很清楚)这个基类的派生子类实现基类定义的虚函数,基类的Vtb则指向派生类的方法体。当你调用一个子类时,首先将消息发送到基类,由基类来判断该消息该发往哪个派生类,然后由基类对消息进行转发。所以动态绑定实际上是通过消息控制的。Top
11 楼neptunez()回复于 2002-04-15 11:34:24 得分 0
束定应该也是biding拉,dynamic biding就是晚捆绑,基本一个意思Top
12 楼sxw997405(sxw)回复于 2002-04-18 22:22:01 得分 0
感谢各位!!请问有长沙的朋友吗?Top
13 楼zzyy()回复于 2002-04-19 11:58:37 得分 0
to sxw997405(sxw):
me!Top




