如何在c中编写虚函数?

时间:2017-05-25 16:27:19

标签: c virtual

为了遵循准备好的设计文档,我想在C中创建虚拟功能。有没有最佳实践呢? 正如@imreal建议我们可以使用函数指针来转换C结构,类似于C ++类,但我们如何确保虚基类函数覆盖派生类函数。

在我的情况下,我需要此功能来遵循文档,但我认为当我们将C ++代码转换为C时它也很有用。这在将C ++代码与C代码组合时是必需的。

4 个答案:

答案 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指针来访问数据成员。

实例:

http://ideone.com/LPSd65

答案 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;
}