[英]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.