如何定义C和C++中的结构继承?

如何定义C和C++中的结构继承?,c++,c,inheritance,struct,C++,C,Inheritance,Struct,谈到结构,是否可以只将结构的字段复制到另一个结构,而不显式调用类型字段名 让我给你举个例子: struct StructA { char Name[20]; int Age; }; struct StructB { StructA FieldStructA; int SomeOtherDeclarations; // ... }; 因此,我可以通过以下方式访问StructB上的StructA字段: StructB strB; strB.FieldStructA

谈到结构,是否可以只将结构的字段复制到另一个结构,而不显式调用类型字段名

让我给你举个例子:

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

struct StructB
{
   StructA FieldStructA;

   int SomeOtherDeclarations;
   // ...
};
因此,我可以通过以下方式访问StructB上的StructA字段:

StructB strB;
strB.FieldStructA.Name[0] = 0;
我想做的是通过StructB访问StructA字段,而不访问StructB上的数据字段。类似于类之间的继承。像这样:

StructB strB;
strB.Name[0] = 0;
我想继承StructB上的StructA字段。我知道我可以用类来实现这一点,但出于互操作、堆栈的特定使用等原因,我不得不使用struct


谢谢你的时间

在普通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;
在这种情况下,StructA和StructB彼此没有连接。但是你有相同的字段。这至少为您提供了一点模块化。像这样的宏通常用于实现/伪造新语言提供给您的东西,例如继承性或泛型

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;
}

在普通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;
在这种情况下,StructA和StructB彼此没有连接。但是你有相同的字段。这至少为您提供了一点模块化。像这样的宏通常用于实现/伪造新语言提供给您的东西,例如继承性或泛型

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;
}

可以使用继承来执行C++:

struct StructB: public StructA
{
   int SomeOtherDeclarations;
   // ...
};
鉴于此,你可以这样做

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

可以使用继承来执行C++:

struct StructB: public StructA
{
   int SomeOtherDeclarations;
   // ...
};
鉴于此,你可以这样做

StructB strB;
strB.Name[0] = 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:代码之所以有效,是因为“基本”字段实际上是“派生”结构的第一个成员。因此,可以在通过struct StructA*访问字段的位置使用struct StructB*类型的值。这是接口重用:用于访问StrutA的一组函数可以用于访问C++中的Strut../P>< P>中的相同字段,继承用于接口重用,而不是实现重用。你可以很容易地得到后一个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:代码之所以有效,是因为“基本”字段实际上是“派生”结构的第一个成员。因此,可以在通过struct StructA*访问字段的位置使用struct StructB*类型的值。这是接口重用:用于访问StructA的同一组函数可用于访问StructB中的相同字段。

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


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


C++中的类和结构是相同的,除了字段的默认可见性。你可以用一个类来做,也可以用一个结构来做。如果你在C++上有了结构,就像类一样。结构B:A{};很好。你的答案在问题标题中。如果你在谈论C++。你应该选择这两种语言中的一种。@ Sale:另一个不同之处是默认结构是公共的,它是类的私有。写C++而不是C,即STD::string name如何?即使在C语言中,我也可能使用动态分配的内存块,而不是固定大小的数组。你如何解释弗罗伊德冯比斯马克III?C++类和结构是相同的东西,除了字段的默认可见性。你可以用一个类来做,也可以用一个结构来做。如果你在C++上有了结构,就像类一样。结构B:A{};很好。你的答案在问题标题中。如果你在谈论C++。你应该选择这两种语言中的一种。@ Sale:另一个不同之处是默认结构是公共的,它是类的私有。写C++而不是C,即STD::string name如何?即使在C语言中,我也可能使用动态分配的内存块,而不是固定大小的数组。你怎么解释Frued Von Bissmark III先生呢?无论如何,结构的默认继承已经是公共的了——所以如果你愿意的话,你可以省略它。我更喜欢明确地说明这一点。否则会让人困惑,我想
对C++和我的最好答案是C的最佳答案。OP太糟糕了,其中一个问题是:在继承时,我只能设置在偏移0开始的基本结构字段。例如,如果我必须将这些字段设置为偏移量200h,该怎么办?谢谢你的回复。值得一提的是,structs的默认继承已经是公共的了——所以如果你愿意的话,你可以省略它。我更喜欢对它进行明确的说明。否则,这是对C++最好的回答。我认为C是最好的答案。C太糟糕了,OP在一个问题上提出了两个问题。这样做的问题是,用继承我只能在偏移0开始设置基本结构字段。例如,如果我必须将这些字段设置为偏移量200h,该怎么办?谢谢btw的回复。不需要GCC。C11正式具有该功能:不需要GCC。C11正式具有该功能: