Chinaunix首页 | 论坛 | 博客
  • 博客访问: 999486
  • 博文数量: 442
  • 博客积分: 1146
  • 博客等级: 少尉
  • 技术积分: 1604
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 12:52
个人简介

123

文章分类

全部博文(442)

文章存档

2017年(3)

2016年(15)

2015年(132)

2014年(52)

2013年(101)

2012年(110)

2011年(29)

分类:

2012-01-18 22:13:26

原文地址:C与多层继承 作者:mtloveft

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
提示:本文是介绍C是如何实现OO的多层继承
 
之前写了一篇关于C与OO的文章,
 
这是对这篇文章的补充。
高级语言的多层继承如下图
 
也就是男学生要继承于男人,男人又继承于人,数据的构成如下
 
如果用C怎么实现呢?其实是很简单的。定义代码如下

struct Person {
    char* name;
    int sex;
}

struct Man {
    strcut Person p;
    char* beard;
}

struct Student {
    struct Man m;
    int id;
}

 
操作代码如下

Person *p;
Man *m;
Student *s;
p = kzalloc(sizeof(struct Student), GFP_KERNEL);
m = (Man *) p;
s = (Student *) p;

p = (Person *) m;
p = (Person *) s;

m = (Man *) s;
s = (Student *) m;

 
当然给p分配内存大小就必须使Student的大小了,这样就不用考虑内存越界的问题了。
其实高级语言也是这么实现的。你看看构造方法里是不是第一条语句就是构造基类。其它语句是编译不过去的。
这种多层继承在Linux内核程序里很多地方都有,例如socket的实现。
看看图,如下
结构够复杂的了吧,没办法,要利用高级语言的特性,只能这么用了。
这样udp_sock, inet_sock inet, sock sk之间就可以互相转换了。而不用考虑越界的问题了。
当然最开始的内存分配也应该如下

Sock * sk = kzalloc(sizeof(struct udp_sock), GFP_KERNEL);

这样才能保证数据的正确性。
 
 
 
 
 
 



阅读(488) | 评论(0) | 转发(0) |
0

上一篇:Kernel base Series(2)-----hlist_head

下一篇:C与OO

给主人留下些什么吧!~~