如何在C和C ++中定义结构之间的某种继承?

时间:2012-08-15 19:42:22

标签: c++ c inheritance struct

谈论结构,是否可以将struct的字段复制到另一个struct而无需显式调用类型字段名称?

让我举个例子:

struct StructA
{
   char Name[20];
   int Age;
};

struct StructB
{
   StructA FieldStructA;

   int SomeOtherDeclarations;
   // ...
};

因此,我可以访问StructA上的StructB字段:

StructB strB;
strB.FieldStructA.Name[0] = 0;

我想要做的是通过StructA访问StructB字段,而无需访问StructB上的数据字段。类似于类之间的继承。像这样:

StructB strB;
strB.Name[0] = 0;

我想继承StructA上的StructB字段。我知道我可以用类来做,但由于某些原因我必须使用struct(互操作,堆栈的具体使用等)。

谢谢你的时间!

4 个答案:

答案 0 :(得分:5)

您可以使用继承在C ++中执行此操作:

struct StructB: public StructA
{
   int SomeOtherDeclarations;
   // ...
};

鉴于此,您可以执行

StructB strB;
strB.Name[0] = 0;

答案 1 :(得分:1)

在简单的C中,我有两个选择:

1 - 使用宏定义这些字段。然后你可以在两个结构中使用它们

#define PERSON_FIELDS \
char Name[20]; \
int Age; \

struct StructA
{
STRUCT_A_FIELDS
};

struct StructB
{
   STRUCT_A_FIELDS

   int thing;
   // ...
};

然后您可以使用

StructB strB;
strB.Name[0] = 0;


StructA strA;
strA.Name[0] = 0;

在这种情况下,StructAStructB之间没有任何关联。但是你有相同的领域。这至少为您提供了一些模块化。像这样的宏通常用于实现/伪造新语言给你的东西(例如继承或通用性)。

2 - 或者你可以保留上面的代码,但使用访问器函数来获取值:

struct StructA
{
   char Name[20];
   int Age;
};

struct StructB
{
   StructA FieldStructA;

   int thing;
   // ...
};


int StructB_Thing(struct Struct *obj)
{
    return obj->thing;
}

int StructB_Age(struct Struct *obj)
{
    return obj->FieldStructA.Age;
}

答案 2 :(得分:0)

在C ++中,继承用于接口重用,而不是实现重用。你可以很容易地得到后者的C,但前者需要知道一个小技巧:

struct StructA
{
   char Name[20];
   int Age;
};

struct StructB
{
   StructA FieldStructA;

   int SomeOtherDeclarations;
   // ...
};

诀窍是明白你可以做到

void setAge( struct StructA *s, int age ) {
    s->Age = age;
}

struct StructB b;
setAge( (struct StructA *)&b, 33 );
/* b.FieldStructA.Age is now 33 */

注意你不必在这里任何地方提到FieldStructA:代码可以工作,因为'base'字段实际上是'derived'结构的第一个成员。因此,struct StructB *类型的值可以在您通过struct StructA *访问字段的位置使用。这是接口重用:用于访问StructA的同一组函数可用于访问StructB中的相同字段。

答案 3 :(得分:0)

如果您使用的是gcc,请尝试将其设为匿名成员:

http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html

struct StructA
{
  char Name[20];
  int Age;
};

struct StructB
{
   struct StructA;

   int SomeOtherDeclarations;
   // ...
};