高分求答:如何用C实现多重继承?(在线等待)

rester214 2003-09-05 09:55:28
就是说,B继承了A,C又继承了B,该如何实现?

不吝赐教啊,一定给分的说~
...全文
214 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandrowjw 2003-09-05
  • 打赏
  • 举报
回复
另外,实际上对于所有成员的访问都可以用Offset_Of的方法来解决的,你只要在继承的时候修改一下这个Offset的值就可以了。
sandrowjw 2003-09-05
  • 打赏
  • 举报
回复
我这就是一个例子,具体的实现不一定这样写的,比如你可以这样
#define MULTI_DERIVED_CLASS_BEGIN(n, b1, b2)\
struct n{\
b1 m1;\
b2 m2;

#define MULTI_DERIVED_CLASS_END\
};\
size_t Offset_Of_##b1()\
{ return 0; }\
size_t Offset_Of_##b2()\
{ return sizeof(n) - sizeof(b2); }

这样你就可以定义乘
MULTI_DERIVED_CLASS_BEGIN(derived, base1, base2)
//新增加的变量
int i;
int b;
MULTI_DERIVED_CLASS_END

另外,访问控制我觉得除了把所有的访问操作都改成宏,没有其他的好的办法。另外,接口表也是一个方法,但是不一定符合要求。
cdocument 2003-09-05
  • 打赏
  • 举报
回复
请问搂住: 你的目的是?
dddd8888 2003-09-05
  • 打赏
  • 举报
回复
如果C能实现多重继承,那还发明C++干什么?
sandrowjw 2003-09-05
  • 打赏
  • 举报
回复
要用宏的
#define MULTI_DERIVED_CLASS(n, b1, b2)\
struct n{\
b1 m1;\
b2 m2;\
};\
size_t Offset_Of_##b1()\
{ return 0; }\
size_t Offset_Of_##b2()\
{ return sizeof(n) - sizeof(b2); }

这样你可以明白一些了吧,实际上所有的访问都要用宏包装起来的。
然后,最常见的一个trick就是slice的时候(a是某个基类型,b是继承的类型,type是基类型的类型)
#define SLICE_ASSIGN(a, b, type)\
memcpy(&a, &b + Offset_Of_##type(), sizeof(a));

这样就实现了根据基类型来进行slice,但是你肯定不能直接用=了。
sysmaster 2003-09-05
  • 打赏
  • 举报
回复
没有类那来的继承????? C中有继承这一提法吗?
今天看来又得喝水去了!
rester214 2003-09-05
  • 打赏
  • 举报
回复
是啊,基本上是用组合模仿继承的。
但是两层结构的继承怎么写真的不知道。
先把自己的单层继承的代码贴一下,以便大家更了解我的问题。
/*File A.h*/
typedef BOOL (*setRelation)(void*,short,short);

typedef struct CCorres_t{
void* body;

int count;
char* str;

setRelation SetRelation;
}CCorres;


/*File B.h*/
#include "A.h"

typedef struct CBToC_t{
CCorres super;

int count;
char* str;
}CBToC;
extern CCorres* BToC_Instance(CBToC*);
extern BOOL BToC_SetRelation(CBToC*,short,short);

/*File B.c*/
#include "B.h"
CCorres* BToC_Initialize(CBToC* this)
{
this->super.body = this;
this->super.SetRelation = BToC_SetRelation;

return &(this -> super);
}

CCorres* BToC_Instance(CBToC* this)
{
return BToC_Initialize(this);
}
cdocument 2003-09-05
  • 打赏
  • 举报
回复
在C中也能继承吗? 好像只能组合吧。
如果非要模仿C++的继承,不知道用#define行不行?
jp311 2003-09-05
  • 打赏
  • 举报
回复
组合行不?
struct A {}
struct B { struct A a; }
struct C { struct B b; }
rester214 2003-09-05
  • 打赏
  • 举报
回复
不是我不想用C++啊老大,这是上面的要求~~

吐血ing~
蝎子i软件 2003-09-05
  • 打赏
  • 举报
回复
你为什么要这样做?

为什么不用C++?
zhbaby163 2003-09-05
  • 打赏
  • 举报
回复
不好意思,我不想得分。所以我也就不回答了。
实在不好意思 。
rester214 2003-09-05
  • 打赏
  • 举报
回复
sandrowjw(伊巴密浓达):
明白你说的了。不过,在结构体中含有函数指针,如何继承(两层的)下来呢?
sandrowjw 2003-09-05
  • 打赏
  • 举报
回复
先看你的问题吧,下面的继承关系如何实现:
class A
{
int a;
};
class B : public A
{
int b;
};
class C : public B
{
int c;
};
最简单的用struct模拟的方法如下
struct A
{
int a;
};
struct B
{
A a;
int b;
};
struct C
{
B b;
int c;
};
现在你要实现下面的语句
C cc;
cc.a = 0;
那么肯定要用到强制转换,实际上就是下面的格式
C cc;
((A*)&cc)->a = 0;
实际上这里是
(A*)(&cc + Offset_Of_A_in_C())->a;
因为是单线的继承,所以Offset可以不要了,对于多个父类的继承,则要计算Offset的(如我上面所说的)。
那么Offset_Of_A_in_C()就可以这样定义
size_t Offset_Of_A_in_C()
{ return Offset_Of_A_in_B() + Offset_Of_B_in_C(); }//单线的继承
而,因为都是单线的继承,所以有
size_t Offset_Of_B_in_C()
{ return 0; }
size_t Offset_Of_A_in_B()
{ return 0; }
这样就达到你要的结果了
(A*)(&cc + Offset_Of_A_in_C())->a
实际上就是
(A*)(&cc + 0)->a,
于是我们用一句宏定义
#define GetMember(C, cc, A, a)\
return (A*)(&cc + Offset_Of_##A##_in_##C##())->a;
就可以了,但是这里还是要给基类的类型的,你可以做得更好一些,就能只给C,cc和a。
rester214 2003-09-05
  • 打赏
  • 举报
回复
有人吗?各位兄台,帮帮忙啊!
rester214 2003-09-05
  • 打赏
  • 举报
回复
楼上的老大,能说得更浅显一点么?

你说的方式我从未用过 #^_^#

skywater 2003-09-05
  • 打赏
  • 举报
回复
这个问题问得好奇怪也。继承是面向对象的程序语言特有的东西,C是面向过程的语言,哪里来的继承?
除了继承,多态性、重载、构造函数、析构函数、虚函数,这些概念,都是面向对象的程序设计语言才有的。
虽然c和c++的语法很类似,但是二者的关系是:C是C++的一个子集。C有的,C++一定有。C++有的,C不一定有呀。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧