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