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 只是一种范式,并不是唯一的范式!
是否可以在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 只是一种范式,并不是唯一的范式!