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

  • 相关阅读:
    JS闭包应用-私有变量、柯里化、偏函数
    JS限流与防抖
    JS自定义事件与事件代理
    CSS 去除图片和父元素底部间隙
    logstash使用http收集日志送Kafka
    shell中if条件语句结尾fi前面如果有&可以没有;
    filebeat 采集日志送Kafka
    JavaScript通过reduce+递归实现树的深度遍历
    WebStorm配置vueCli+eslint+prettier保存自动格式化
    ECMAScript 6 promise
  • 原文地址:https://www.cnblogs.com/mlj318/p/2375869.html
Copyright © 2011-2022 走看看