抽象基类和公共继承

时间:2012-11-13 07:07:32

标签: c++ inheritance

我希望你们中的任何一位优秀的人能帮助我澄清一些事情。

说我有以下代码:

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

1 个答案:

答案 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();
  }
}