荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店