c++ - 避免 C++ 多态性

标签 c++ c polymorphism interpreter

我最近创建了自己的脚本语言。我的代码结构很大程度上基于多态性。 (我不太确定这是如何调用的。我有一个虚拟函数,然后派生该类并让操作系统决定在运行时调用什么):

class Statement 
{ 
    virtual void exec() = 0; 
};

class PrintStmt : public Statement
{ 
    void exec() 
    { 
        std::cout << expression->eval(); 
    };    

class AssignStmt : public Statement
{ 
    void exec() 
    { 
        vm->bind_var(name, expression->eval()) 
    };

有什么想法可以修改它,以便它可以由纯 C 编译器编译吗? 我知道这是一般性问题,没有单一的答案,但你会怎么做?

注意:我已经下载了 python 代码作为引用,但我需要一些时间才能弄清楚它是如何工作的。

最佳答案

Statement 将是一个struct。除了其数据成员之外,您还需要一个函数指针,例如

struct Statement
{
    void(*exec)(Statement* this); // Function pointer
    // Other members
};

然后,您将获得每个语句类型的函数的不同实现以及用于制造正确类型的对象的函数,例如

static void printExec(struct Statement* this)
{
    printf("%s", this->whatever);
}

struct Statement* createPrintStatement()
{
    struct Statement* statement = calloc(1, sizeof(struct Statement));
    statement->exec = printExec;
    return statement;
}

你可以像这样调用它:

statement->exec(statement);

this 指针使您可以访问特定结构的数据成员,即您调用的 exec 方法的实例。

如果您有很多函数,请考虑使用 vtable。

struct VTable
{
    void(*exec)(Statement* this); // Function pointer
    const char* (*stringValue)(Statement* this); // Function pointer
};

struct Statement
{
    struct VTable* vtable;
    // Other members
};

您只需为每种对象构建一次 vtable

struct VTable printVTable =
{
    printExec,
    printStringValue
};

您可以这样创建新对象:

struct Statement* createPrintStatement()
{
    struct Statement* statement = calloc(1, sizeof(struct Statement));
    statement->vtable = &printVTable;
    return statement;
}

并因此调用方法

statement->vtable->exec(statement);

vtable 方法或多或少是 C++ 在幕后所做的事情。

关于c++ - 避免 C++ 多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16108342/

相关文章:

java - 属性和多态性

c++ - c++中动态调度的规则是什么?

c++ - 什么时候释放与静态变量相关的内存?

objective-c - 指向 Objective-C 函数调用中的数组的指针

c++ - 如何在此代码上访问 webbrowser 对象? C++

c++ - 如何防止 emacs C/C++ 模式自动更正?

c - 使用 qsort 对 2D 数组进行排序

java - 从其他类调用 Activity 的重写方法

c++ - Intel x86 上的 C++ 原子是否需要内存屏障?

c++ - 是return *array;有效的?