1. 多继承强转的指针偏移问题
class testA
{
public:
int a;
int b;
};
class testB
{
public:
int c;
int d;
};
class Mul : public testA,public testB
{
public:
Mul()
{
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
}
int e;
};
Mul mul;
Mul *p_mul = &mul;
int main(int argc, char* argv[])
{
printf("%p\n",p_mul);
printf("%p\n",(testA *)p_mul);
printf("%p\n",(testB *)p_mul);
return 0;
}
输出:
0003B14C
0003B14C
0003B154
可以看到强转为test类型是地址发生了偏移
2. 问题发生
如果把我们上面定义的类型分文件存储
classtest.h
#pragma once
class testA
{
public:
int a;
int b;
};
class testB
{
public:
int c;
int d;
};
mulclass.h
#pragma once
#include "classtest.h"
class Mul : public testA,public testB
{
public:
Mul()
{
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
}
int e;
};
mulclass.cpp
#pragma once
#include "classtest.h"
class Mul : public testA,public testB
{
public:
Mul()
{
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
}
int e;
};
main.c
#include <stdio.h>
#include <stdlib.h>
#include "classtest.h"
//#include "mulclass.h"
class Mul;
extern Mul* p_mul;
int testA_add(testB *test)
{
printf("test->c : %d\n",test->c);
printf("test->d : %d\n",test->d);
return test->c + test->d;
}
int main(int argc, char* argv[])
{
testA_add((testB *)p_mul);
//printf("%p\n",p_mul);
//printf("%p\n",(testA *)p_mul);
//printf("%p\n",(testB *)p_mul);
return 0;
}
输出:
test->c : 1
test->d : 2
可以看到输出并不是 3,4
如果我们把 #include “mulclass.h” 注释去掉就可以看到正常输出了。
原因分析:
在进行多继承强转为父类时没有引入具体类型的头文件的话,编译的时候无法确定父类具体的偏移值