簡體   English   中英

抽象基類和公共繼承

[英]Abstract Base Class and public 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()時出現分段錯誤。

為了調用foo(),我是否需要具有類型heritFromFrom ABS和AlsoInheritFromFrom ABS的對象的列表? 每個?

編輯:這是我的實際代碼,其中由於分段錯誤而失敗:

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的代碼生成,即以下代碼:

llvm::Value *VariableExprAST::Codegen() {
    cout << "I am here" << endl;
    return 0;//FIXME: im broken
}

一切都遵循,沒有任何警告,但是一旦我提供了簡單的輸入,它就會在tmp-> Codegen()之前以segfault失敗。

您嘗試執行的操作看起來正確,但是您需要將指針存儲在列表中。 目前尚不清楚您當前的代碼將如何編譯,但是您可能打算這樣做:

list<someABC *> myList;
inheritFromABS* first = new inheritFromABS();
alsoInheritFromABS* second = new alsoInheritFromABS();
myList.push_back(first);
myList.push_back(second);

即: inheritFromABS* first = ...而不是inheritFromABS first = ... 您還應該在基類中添加虛擬析構函數

這里有一個簡單的工作示例,遵循經典主題。 請注意,在實際的應用程序中,您將使用智能指針而不是原始指針 此示例缺少內存取消分配。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM