荔园在线

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

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


发信人: littlebao (爱拼才会赢), 信区: Visual
标  题: Re: 看看是调用了那个函数????
发信站: 荔园晨风BBS站 (Sun Aug 24 14:15:51 2003), 站内信件

其实这是vtbl在其作用,
试着把CB或CA中的函数增加或删除就知道了
reinterpret_cast把CC类型的指针强制转换为CB型的,
pB虽然是CB型的,但其实它是指向CC的vtbl的。
昨天跟踪聚合时的一个类函数时,这一点可把我搞了一个一整天,两个类明明没有
继承关系调用一个类的函数却跑到另一个类里去了。

【 在 oopilix (优雅的) 的大作中提到: 】
: 运行了一下,输出是调用了CC的虚函数实现。
: 用reinterpret_cast可以强制关联两个类并转换pB为CC类的指针。
: 所以输出是CC的各个函数吧。
: 【 在 littlebao (爱拼才会赢) 的大作中提到: 】
: 昨天看com的包容和聚合时一个函数调用的问题搞的我头晕脑胀的
: 原来一切都是虚函数搞的鬼。大家看看下面的
: pB->BFun1() ;
: pB->BFun2() ;
: pB->BFun3()
: 分别调用的是那个函数??
: #include "stdafx.h"
: #include "iostream"
: using namespace std ;
: class CA
: {
: public :
:         virtual void fun1() = 0 ;
:         virtual void fun2() = 0 ;
:         virtual void fun3() = 0 ;
: };
: class CB
: {
: public :
:         virtual void BFun1() = 0 ;
:         virtual void BFun2() = 0 ;
:         virtual void BFun3() = 0 ;
: };
: class CC : public CA
: {
: public :
:         virtual void fun1() {cout<<"fun1"<<endl ;}
:         virtual void fun2() {cout<<"fun2"<<endl ;}
:         virtual void fun3() {cout<<"fun3"<<endl ;}
: };
: int _tmain(int argc, _TCHAR* argv[])
: {
:         CB * pB = NULL ;
:         CC Ctest ;
:         pB = reinterpret_cast<CB *>(static_cast<CA*>(&Ctest)) ;
:         pB->BFun1() ;
:         pB->BFun2() ;
:         pB->BFun3() ;
:         return 0;
: }


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


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

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