荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Begin (Forever Trying!), 信区: Program
标  题: Re: virtual函数一问
发信站: BBS 荔园晨风站 (Fri Jan  5 03:42:12 2001), 转信

讲起来一匹布那么长,
简单的说,就是有一个表,编译器为有虚函数的类建立了一个表指针,
比如:
class c1{
public:               有一个指针ptr  --->  vtable(这个标指示着虚函数的入口地址)
  m_data;                                  (*f1)() -> c1::f1()
  vitual f1();                             (*f2)() -> c1::f2()
  vitual f2();
}

class c2 : public c1    此时 vtable中的内容就变成了 (*f1)() -> c1::f1()
{                                                   (*f2)() -> c2::f2()
public:
 vitual f2();
}
动态联编机制在运行期,根据虚函数表来做出正确选择.

可以看出,原理是很简单的,实际上,不用虚函数,
可以自己定义这个指针,自己实现这种机制,也并不困难,
就是定义一个指针,并且在继承的时候复制和更新这个表,
构造的时候就把这个ptr指向对应的表,
比如定义c1 *C = new c2();就把c2的表给C,
有兴趣大家可以自己编来试试,不试不知道,一试保证就明白了.

【 在 hewlett (uclan) 的大作中提到: 】
: 用virtual声明函数表示在该函数在派生类中可能有
: 不同的实现。
: 那么编译器是如何确定到底调用哪个函数的实现呢?
: (好象跟什么动态联编有关,不是很明白)


--
Good programming is %99 sweat and %1 coffee.

※ 来源:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: bbs.shenzhen.gd.cn]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店