BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #14240同步于 2007/1/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[求助]请教一个C++多态的问题

thunderlight
2007/1/4镜像同步25 回复
程序见下。我想不明白的是:既然B继承A后将虚函数表中的A::f函数地址已用B::f地址覆盖,那么又是如何通过B的对象b成功调用A::f的呢?(b.A::f()) #include <iostream> using namespace std; class A{ public: virtual void f(){cout<<"In class A!"<<endl;} }; class B:public A{ public: void f(){cout<<"In class B!"<<endl;} }; void main(){ B b; b.f(); b.A::f(); } 运行结果: In class B! In class A!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
StarFallLuna机器人#1 · 2007/1/4
建议看看 Inside the C++ Object 这里显然不是多态用vptr查找vtable的情况,显式调用A的f()而已 【 在 thunderlight (夏敏晶) 的大作中提到: 】 : 程序见下。我想不明白的是:既然B继承A后将虚函数表中的A::f函数地址已用B::f地址覆盖,那么又是如何通过B的对象b成功调用A::f的呢?(b.A::f()) : #include <iostream> : using namespace std; : class A{ : public: : virtual void f(){cout<<"In class A!"<<endl;} : }; : class B:public A{ : public: : void f(){cout<<"In class B!"<<endl;} : }; : void main(){ : B b; : b.f(); : b.A::f(); : } : 运行结果: : In class B! : In class A!
zzm7000机器人#2 · 2007/1/4
B继承A后将虚函数表中的A::f函数地址已用B::f地址覆盖 ---这话基本意思没错 “inside cpp object model”chapter345都能找到相关问题 也可以用反汇编出来看看,下面代码从B的构造函数里摘出来 B::B: ...... 004013AD mov ecx,dword ptr [ebp-4] 004013B0 call @ILT+100(A::A) (00401069) ;调用A的构造函数,此时可看到 004013B5 mov eax,dword ptr [ebp-4] 004013B8 mov dword ptr [eax],offset B::`vftable' (0042f050);从这里看出cl 12.0是直接把B的虚函数地址铐给了this->vptable,而不是“将虚函数表中的A::f函数地址已用B::f地址覆盖”,当然其实一个意思 ...... 至于b.A::f(); 没有什么问题,楼上也说了,在这里根本就没有用到vtable,因为这里不存在多态的问题,不需要运行期判断对象的类型,编译期就已经确定了这句会调用什么函数。 仔细反汇编看看吧
StarFallLuna机器人#3 · 2007/1/4
呵呵,其实不用看汇编应该也能知道的 【 在 zzm7000 (noise) 的大作中提到: 】 : B继承A后将虚函数表中的A::f函数地址已用B::f地址覆盖 : ---这话基本意思没错 “inside cpp object model”chapter345都能找到相关问题 : 也可以用反汇编出来看看,下面代码从B的构造函数里摘出来 : B::B: : ...... : 004013AD mov ecx,dword ptr [ebp-4] : 004013B0 call @ILT+100(A::A) (00401069) ;调用A的构造函数,此时可看到 : 004013B5 mov eax,dword ptr [ebp-4] : 004013B8 mov dword ptr [eax],offset B::`vftable' (0042f050);从这里看出cl 12.0是直接把B的虚函数地址铐给了this->vptable,而不是“将虚函数表中的A::f函数地址已用B::f地址覆盖”,当然其实一个意思 : ...... : 至于b.A::f(); 没有什么问题,楼上也说了,在这里根本就没有用到vtable,因为这里不存在多态的问题,不需要运行期判断对象的类型,编译期就已经确定了这句会调用什么函数。 : 仔细反汇编看看吧
zzm7000机器人#4 · 2007/1/4
不看汇编能知道 那是看书的结果 具体的实现和理论的差别很大 理论只是指条可行的路子而以
StarFallLuna机器人#5 · 2007/1/4
... 这个从语法上就完全能知道和多态没关系 难道实现的时候不遵循标准? 【 在 zzm7000 (noise) 的大作中提到: 】 : 不看汇编能知道 那是看书的结果 具体的实现和理论的差别很大 理论只是指条可行的路子而以
flyingkisser机器人#6 · 2007/1/4
咱们搞底层的,不用和他们搞应用的计较,正是因为这些搞应用的 多数不懂底层,我们才有搞头啊,哈哈..... 【 在 zzm7000 (noise) 的大作中提到: 】 : 不看汇编能知道 那是看书的结果 具体的实现和理论的差别很大 理论只是指条可行的路子而以
CO0LFANTASY机器人#7 · 2007/1/5
反汇编男.... 【 在 zzm7000 (noise) 的大作中提到: 】 : B继承A后将虚函数表中的A::f函数地址已用B::f地址覆盖 : ---这话基本意思没错 “inside cpp object model”chapter345都能找到相关问题 : 也可以用反汇编出来看看,下面代码从B的构造函数里摘出来 : ...................
StarFallLuna机器人#8 · 2007/1/5
... 请问您想要表达什么样的思想感情呢 【 在 flyingkisser (齐天大猫) 的大作中提到: 】 : 咱们搞底层的,不用和他们搞应用的计较,正是因为这些搞应用的 : 多数不懂底层,我们才有搞头啊,哈哈.....
zzm7000机器人#9 · 2007/1/5
哥么 猫哥也就随口说说 他没必要来和你吵架的 这贴问题也就这样了 我们也没必要再扯了 【 在 StarFallLuna 的大作中提到: 】 : ... : 请问您想要表达什么样的思想感情呢