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