C++中有一个基类base和一个派生类derived,转换为C的结构体后,基类的元素全部复制到派生类,但是调用基类的函数时,把派生类的结构体指针强制转换成基类指针仍然可以正确调用吗?
#include <stdio.h> #include <stdlib.h> typedef struct base { int a; int* p; }base; typedef struct derived { int b;//新增的元素在前面 int a; int* p; }derived; void base_create(base* ptr) { ptr->a = 18; ptr->p = (int*)malloc(5); printf("p:%d a:%d\n",ptr->p,ptr->a); } void base_destory(base* ptr) { if(ptr->p) { free(ptr->p); ptr->p = NULL; } } void main() { derived father1; printf("p:%d a:%d\n",father1.p,father1.a); base_create((base*)&father1); printf("p:%d a:%d\n",father1.p,father1.a); base_destory((base*)&father1); }
将derived*强制转换成基类指针base*再调用基类的函数,看看结果:
p:4205972 a:0
p:5574280 a:18
p:4205972 a:5574280
函数返回后派生类结构体中与基类一样的元素的值并为变化,强制转换没有用?
typedef struct derived { int a; int* p; int b; }derived;
如上将新增的元素b放在后面的时候,结果是对的:
p:0 a:4
p:3542664 a:18
p:3542664 a:18
结论:派生类指针向基类转换时,是将派生类指针开始地址起的sizeof(base)大小的内存转换为基类,所以这种继承关系转为C的结构体时,基类 的元素 要按顺序放在 派生类结构体的最前面,这样强制类型转换时才会有效果。