我希望你们中的任何一位优秀的绅士可以帮助我澄清一些事情。
说我有以下代码:
class someABC{
virtual void foo() = 0;
}
以及从它继承的另一个类:
class inheritFromABS : public someABC
{
inheritFromABS();
void foo();
}
和另一个也继承自 someABC 的类:
class alsoInheritFromABS : public someABC
{
alsoInheritFromABS();
void foo();
}
现在我有一个 someABC 类型的对象列表,如下所示:
list<someABC *> myList;
inheritFromABS *first = new inheritFromABS();
alsoInheritFromABS *second = new alsoInheritFromABS();
myList.push_back(first);
myList.push_back(second);
我想遍历 myList 并在每个上调用 foo() 。这甚至可行吗?它编译时没有错误或警告,但是当我尝试调用 foo() 时出现分段错误。
我是否需要拥有类型为 inheritFromABS 和 alsoInheritFromABS 的对象列表才能调用 foo(); 每个?
编辑:这是我的实际代码,它因分段错误而失败:
llvm::Value *decafStmtList::Codegen() {
for(list<decafAST*>::iterator i = stmts.begin(); i != stmts.end(); i++)
{
decafAST *tmp = *i;
tmp->Codegen();
}
return Constant::getNullValue(Type::getDoubleTy(getGlobalContext()));
}
因此,stmts 包含 VariableExprAST 类型的对象之一,我希望它调用 VariableExprAST 的 codegen,代码如下:
llvm::Value *VariableExprAST::Codegen() {
cout << "I am here" << endl;
return 0;//FIXME: im broken
}
一切都没有一个警告,但是一旦我提供了一个简单的输入,它就会在 tmp->Codegen(); 之前失败并出现段错误。