返回信息流#include <iostream>
using namespace std;
class A{
public:
A(){a = 1;}
virtual void fun(){cout <<"A::fun()"<< endl;}
virtual ~A(){cout <<"A::~A()"<< endl;}
int a;
};
class B{
public:
B(){b = 2;}
virtual void fun(){cout <<"B::fun()"<< endl;}
virtual ~B(){cout <<"B::~B()"<< endl;}
int b;
};
class C : virtual public A, virtual public B{
public:
C(){c = 3;}
virtual void fun(){c = 4;cout <<"C::fun()"<< endl;}
virtual ~C(){cout <<"C::~C()"<< endl;}
int c;
};
int main()
{
C c;
C *pc = &c;
pc->fun();
A *pa = &c;
pa->fun();
B *pb = &c;
pb->fun();
return 0;
}
pa和pc最终调用的都是同一个函数实体C::fun(),但是pc不用调整,pa需要调整,编译器怎么解决这个矛盾呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #32615同步于 2009/12/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
问个this指针调整的问题
disk
2009/12/3镜像同步24 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 disk 的大作中提到: 】
: #include <iostream>
: using namespace std;
: class A{
: ...................
把this指针偏移下就ok了
你这个是虚函数调用,用虚函数表间接调用即可
没明白,像pb->fun的话,直接把pb转换为&c就可以了,B的虚函数表里这一项可以是个thunk:sub pb,xx;goto C::fun,但是pa和pc用的都是A的虚函数表里的的C::fun,这一项不可能要调整又不要调整吧【 在 jmpesp 的大作中提到: 】
: 把this指针偏移下就ok了
: 你这个是虚函数调用,用虚函数表间接调用即可
【 在 disk 的大作中提到: 】
: 没明白,像pb->fun的话,直接把pb转换为&c就可以了,B的虚函数表里这一项可以是个thunk:sub pb,xx;goto C::fun,但是pa和pc用的都是A的虚函数表里的的C::fun,这一项不可能要调整又不要调整吧【 在 jmpesp 的大作中提到: 】
你在疑问虚继承的内存布局?
可以这么说吧。查了inside C++ object model,结果这里给简单带过了,只举了个单一继承的例子。
【 在 jmpesp 的大作中提到: 】
: 你在疑问虚继承的内存布局?
vs2008帮我画好了,但并没解开我的疑惑
1>class C size(32):
1> +---
1> 0 | {vbptr}
1> 4 | c
1> +---
1>8 | (vtordisp for vbase A)
1> +--- (virtual base A)
1>12 | {vfptr}
1>16 | a
1> +---
1>20 | (vtordisp for vbase B)
1> +--- (virtual base B)
1>24 | {vfptr}
1>28 | b
1> +---
1>C::$vbtable@:
1> 0 | 0
1> 1 | 12 (Cd(C+0)A)
1> 2 | 24 (Cd(C+0)B)
1>C::$vftable@A@:
1> | -12
1> 0 | &(vtordisp) C::fun
1> 1 | &(vtordisp) C::{dtor}
1>C::$vftable@B@:
1> | -24
1> 0 | &(vtordisp) thunk: this-=12; goto C::fun
1> 1 | &(vtordisp) thunk: this-=12; goto C::{dtor}
1>C::fun this adjustor: 12
1>C::{dtor} this adjustor: 12
1>C::__delDtor this adjustor: 12
1>C::__vecDelDtor this adjustor: 12
1>vbi: class offset o.vbptr o.vbte fVtorDisp
1> A 12 0 4 1
1> B 24 0 8 1
【 在 disk 的大作中提到: 】
: vs2008帮我画好了,但并没解开我的疑惑
: 1>class C size(32):
: 1> +---
: ...................
来,给你看篇文章文章,看下你就明白了