我希望你们中的任何一位优秀的人能帮助我澄清一些事情。
说我有以下代码:
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和inInheritFromABS的对象列表才能调用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-&gt; Codegen();
之前就失败了segfault答案 0 :(得分:0)
您尝试的内容看起来是正确的,但您需要在列表中存储指针。目前尚不清楚当前代码是如何编译的,但你可能意味着这样做:
list<someABC *> myList;
inheritFromABS* first = new inheritFromABS();
alsoInheritFromABS* second = new alsoInheritFromABS();
myList.push_back(first);
myList.push_back(second);
即inheritFromABS* first = ...
而不是inheritFromABS first = ...
。您还应该在基类中添加虚拟析构函数。
这是一个简单的工作示例,遵循经典主题。请注意,在实际应用程序中,您将使用smart pointers而不是原始应用程序。此示例缺少内存取消分配。
#include <iostream>
#include <list>
struct Animal
{
virtual void talk() const =0;
virtual ~Animal() {}
};
struct Dog : Animal
{
void talk() const { std::cout << "Woof woof!\n"; }
};
struct Cow : Animal
{
void talk() const { std::cout << "Moooo!\n"; }
};
int main()
{
std::list<Animal*> animals;
animals.push_back(new Dog);
animals.push_back(new Cow);
animals.push_back(new Dog);
animals.push_back(new Cow);
animals.push_back(new Dog);
animals.push_back(new Cow);
for (std::list<Animal*>::const_iterator it = animals.begin();
it != animals.end();
++it)
{
(*it)->talk();
}
}