あなたの素晴らしい紳士の誰かが私が何かを明確にするのを手伝ってくれることを望んでいました.
次のコードがあるとします。
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() を呼び出そうとするとセグメンテーション違反が発生します。
foo(); を呼び出すには、inheritFromABS 型と InheritFromABS 型のオブジェクトのリストが必要ですか? それぞれ?
編集:これは、セグメンテーション違反で失敗する私の実際のコードです:
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 型のオブジェクトの 1 つが含まれており、VariableExprAST の codegen を呼び出す必要があります。コードは次のとおりです。
llvm::Value *VariableExprAST::Codegen() {
cout << "I am here" << endl;
return 0;//FIXME: im broken
}
すべてが単一の警告なしで準拠していますが、単純な入力を提供すると、tmp->Codegen(); の直前で segfault で失敗します。