Chinaunix首页 | 论坛 | 博客
  • 博客访问: 173120
  • 博文数量: 64
  • 博客积分: 13
  • 博客等级: 民兵
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-20 21:17
文章分类
文章存档

2012年(64)

分类:

2012-01-27 18:09:34

原文地址: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);

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



阅读(1040) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~