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

时间:2015-04-07 15:16:07

标签: c oop struct

是否可以在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中?我应该如何实现它?

2 个答案:

答案 0 :(得分:2)

简答:否。

更长的答案:C不是面向对象的,它永远不会面向对象。您可以执行许多面向对象的操作,例如创建结构,以及对结构进行操作的函数。但是,如果您尝试通过尝试模拟面向对象的标准来编写所有C代码,您会发现它残酷而低效。继承是实施过程中残酷和低效的事情之一。

然而,人们经常使用构图而不是继承。这是您在B类中包含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只是一种范式,并不是唯一的范例!

答案 1 :(得分:1)

是的,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);