为了遵循准备好的设计文档,我想在C中创建虚拟功能。有没有最佳实践呢? 正如@imreal建议我们可以使用函数指针来转换C结构,类似于C ++类,但我们如何确保虚基类函数覆盖派生类函数。
在我的情况下,我需要此功能来遵循文档,但我认为当我们将C ++代码转换为C时它也很有用。这在将C ++代码与C代码组合时是必需的。
答案 0 :(得分:4)
该语言不提供此功能,但您可以实现相同的功能。
使用函数指针创建一个结构:
typedef struct Base Base_t;
struct Base {
void (*f1)(Base_t* self);
void (*f2)(Base_t* self);
int dat1;
int dat2;
};
编写一个函数来充当构造函数,为这些指针分配不同的函数。
Base constructor1()
{
Base l = {func1, func2, 0, 0};
return l;
}
Base constructor2()
{
Base l = {func3, func4, 6, 13};
return l;
}
调用方法:
Base a = constructor1();
a.f1(&a);
每个函数都使用self / this指针来访问数据成员。
实例:
答案 1 :(得分:2)
不,你不能。 '虚拟'不是C词汇表的一部分,也不是'访问级别'
答案 2 :(得分:0)
在C中,没有“虚拟”功能这样的概念。
相反,我建议你在这里查看我的答案:https://stackoverflow.com/a/44102508/1347519
从根本上说:
答案 3 :(得分:-1)
没有内置语言支持,但是如果缺少特殊的实现,您可以获得使用默认实现的相同的一般功能。这样的事情可能是:
#include <stdio.h>
struct animal {
const char *name;
void (*move)(struct animal *);
};
void fly(struct animal *a)
{
printf("soaring %s\n", a->name);
}
void walk(struct animal *a)
{
printf("walk %s, walk\n", a->name);
}
void animal_move(struct animal *a)
{
void (*move)(struct animal *) = a->move ? : walk;
move(a);
}
int main(void)
{
struct animal elephant = { .name = "elephant" };
struct animal bird = { .name = "bird", .move = fly };
animal_move(&elephant);
animal_move(&bird);
return 0;
}