C 传递结构作为参数(继承)

C Passing structure as argument (inheritance)

是否可以在C语言上做这样的事情:

class A
{
    public:
        int x;
        int y;
};
class B : public A
{
    public:
        int w;
        int h;
};

void func(A a)
{
    //Do something here
}

int main()
{
    B b;
    func(b);

    return 0;
}

在 C 语言中有结构?我应该如何实施它?

是的,可以在 C 中使用 struct,就像在 C++ 中一样,即将 objects 传递给函数。假设结构是:

struct A {
           int a;
           int b;
         };

函数是:

void func(A a)
{
//Do something here
}

那么 main() 函数将是:

int main()
{
struct A b;
func(b);

return 0;
}

C 中不能继承。 如果您的目标是拥有两种结构,一种从另一种派生内容,那么这可能会有所帮助:

struct A {
           int a;
           int b;
         };

struct B {
           int x;
           int y;
           struct A ob_a;
         };

函数可以修改为:

void func(B b)
{
//Do something here
}

您可以调用该函数:

struct B ob_b;
func(ob_b);

简答:没有。

更长的答案:C 不是面向对象的,它永远不会是面向对象的。你可以做很多面向对象的事情,比如创建结构和操作结构的函数。但是,如果您尝试通过模拟面向对象的标准来编写所有 C 代码,您会发现它残酷且效率低下。继承是实施起来残酷且低效的事情之一。

然而,人们经常使用组合而不是继承。这是在 class B 中包含 class A,而不是继承。如果您决定将父结构作为第一个成员,您可以这样做:

struct A { /* stuff */ };
struct B {
  struct A a;
  /* more stuff */
}
void func(void *obj) {
  struct A *a = (struct A *)obj;
  /* do stuff */
}
int main(int argc, char **argv) {
  struct B b;
  func(&b);
}

这有点吓人,而且没有类型检查。它可以在很多情况下工作,但它不一定具有您期望从面向对象语言中获得的多态性之类的东西。长话短说,尽量不要依赖面向对象的实践——OOP 只是一种范式,并不是唯一的范式!