返回信息流程序见下。我想不明白的是:既然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!
这是一条镜像帖。来源:北邮人论坛 / soft-design / #14240同步于 2007/1/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
[求助]请教一个C++多态的问题
thunderlight
2007/1/4镜像同步25 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
建议看看 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!
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 (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 (noise) 的大作中提到: 】
: 不看汇编能知道 那是看书的结果 具体的实现和理论的差别很大 理论只是指条可行的路子而以
咱们搞底层的,不用和他们搞应用的计较,正是因为这些搞应用的
多数不懂底层,我们才有搞头啊,哈哈.....
【 在 zzm7000 (noise) 的大作中提到: 】
: 不看汇编能知道 那是看书的结果 具体的实现和理论的差别很大 理论只是指条可行的路子而以
反汇编男....
【 在 zzm7000 (noise) 的大作中提到: 】
: B继承A后将虚函数表中的A::f函数地址已用B::f地址覆盖
: ---这话基本意思没错 “inside cpp object model”chapter345都能找到相关问题
: 也可以用反汇编出来看看,下面代码从B的构造函数里摘出来
: ...................
...
请问您想要表达什么样的思想感情呢
【 在 flyingkisser (齐天大猫) 的大作中提到: 】
: 咱们搞底层的,不用和他们搞应用的计较,正是因为这些搞应用的
: 多数不懂底层,我们才有搞头啊,哈哈.....
哥么 猫哥也就随口说说 他没必要来和你吵架的
这贴问题也就这样了 我们也没必要再扯了
【 在 StarFallLuna 的大作中提到: 】
: ...
: 请问您想要表达什么样的思想感情呢