C++类继承转换为C结构体,C结构体指针之间强制类型转换

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的结构体时,基类 的元素 要按顺序放在 派生类结构体的最前面,这样强制类型转换时才会有效果。

原文地址:https://www.cnblogs.com/mlj318/p/2375869.html