先看你的问题吧,下面的继承关系如何实现:
class A
{
int a;
};
class B : public A
{
int b;
};
class C : public B
{
int c;
};
最简单的用struct模拟的方法如下
struct A
{
int a;
};
struct B
{
A a;
int b;
};
struct C
{
B b;
int c;
};
现在你要实现下面的语句
C cc;
cc.a = 0;
那么肯定要用到强制转换,实际上就是下面的格式
C cc;
((A*)&cc)->a = 0;
实际上这里是
(A*)(&cc + Offset_Of_A_in_C())->a;
因为是单线的继承,所以Offset可以不要了,对于多个父类的继承,则要计算Offset的(如我上面所说的)。
那么Offset_Of_A_in_C()就可以这样定义
size_t Offset_Of_A_in_C()
{ return Offset_Of_A_in_B() + Offset_Of_B_in_C(); }//单线的继承
而,因为都是单线的继承,所以有
size_t Offset_Of_B_in_C()
{ return 0; }
size_t Offset_Of_A_in_B()
{ return 0; }
这样就达到你要的结果了
(A*)(&cc + Offset_Of_A_in_C())->a
实际上就是
(A*)(&cc + 0)->a,
于是我们用一句宏定义
#define GetMember(C, cc, A, a)\
return (A*)(&cc + Offset_Of_##A##_in_##C##())->a;
就可以了,但是这里还是要给基类的类型的,你可以做得更好一些,就能只给C,cc和a。