Dan*_*ker 71
你能得到的最接近的是相当常见的习语:
typedef struct
{
// base members
} Base;
typedef struct
{
Base base;
// derived members
} Derived;
Run Code Online (Sandbox Code Playgroud)
作为Derived与副本开始Base,你可以这样做:
Base *b = (Base *)d;
Run Code Online (Sandbox Code Playgroud)
在哪里d的实例Derived.所以他们有点多态.但是拥有虚拟方法是另一个挑战 - 要做到这一点,你需要拥有相当于vtable的指针Base,包含函数指针,这些函数可以接受Base作为第一个参数(你可以命名this)的函数.
到那时,你可以使用C++!
小智 42
与C++不同,C没有明确的继承概念.但是,您可以在另一个结构中重用结构:
typedef struct {
char name[NAMESIZE];
char sex;
} Person;
typedef struct {
Person person;
char job[JOBSIZE];
} Employee;
typedef struct {
Person person;
char booktitle[TITLESIZE];
} LiteraryCharacter;
Run Code Online (Sandbox Code Playgroud)
Mar*_*tin 34
我喜欢并使用C中的Typesafe继承的想法.
例如:
struct Animal
{
int weight;
};
struct Felidae
{
union {
struct Animal animal;
} base;
int furLength;
};
struct Leopard
{
union {
struct Animal animal;
struct Felidae felidae;
} base;
int dotCounter;
};
Run Code Online (Sandbox Code Playgroud)
用法:
struct Leopard leopard;
leopard.base.animal.weight = 44;
leopard.base.felidae.furLength = 2;
leopard.dotCounter = 99;
Run Code Online (Sandbox Code Playgroud)
如果你想使用一些gcc魔法(我认为可以使用微软的C编译器),你可以做类似的事情:
struct A
{
int member1;
};
struct B
{
struct A;
int member2;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc,您可以使用-fms-extensions编译它(允许未命名的struct成员,如Microsofts编译器).这类似于Daniel Earwicker给出的解决方案,除了它允许您访问struct B实例上的memeber1.即B.member1而不是BAmember1.
这可能不是最便携的方法,如果使用C++编译器将无法工作(不同的语言语义意味着它重新声明/定义struct A而不是实例化它).
但是,如果你住在gcc/C的土地上,那么它将会起作用并完全按照你的意愿行事.
小智 8
如果您的编译器支持匿名结构,您可以这样做:
typedef struct Base
{
// base members
} Base_t;
typedef struct
{
struct Base; //anonymous struct
// derived members
} Derived_t;
Run Code Online (Sandbox Code Playgroud)
这样,基础结构成员可以直接获得,这更好.
| 归档时间: |
|
| 查看次数: |
40621 次 |
| 最近记录: |