我在公共遞歸中有一個調用受保護虛函數的問題。在基類崩潰中調用虛擬函數
我想有一個基地類調用遞歸函數getAllStrings(),這一次則在它的「孩子」的所有項目調用虛擬的getString()功能名單。
getString()方法只在其某些子類中實現。
// Base.hpp
class Base
{
private:
// SharedBase is a typedef boost::shared_ptr<Base>
std::list<SharedBase> baseList;
protected:
virtual std::string getString() const
{
return "";
};
public:
Base(){}
virtual ~Base(){}
void addElmtToList(SharedBase sb)
{
baseList.push_back(sb);
}
// recursive
void getAllStrings(std::string &returnedString)
{
if (!baseList.empty())
{
// Iterate through all children
std::list<SharedBase>::iterator itBase = baseList.begin();
while (itBase != baseList.end())
{
(*itBase)->getAllStrings(returnedString);
++itBase;
}
}
returnedString += getString(); // ERROR !
}
};
// Derived_a.hpp
class Derived_a : public Base
{
public:
Derived_a();
virtual ~Derived_a();
protected:
std::string getString() const
{
return "derived_a string";
}
};
// Derived_b.hpp
class Derived_b : public Base
{
public:
Derived_b();
virtual ~Derived_b();
};
所以basicaly應用呼籲getAllStrings( )和一切工作正常,除了呼籲getString(),這使應用程序崩潰。
簡單地調用的getString()功能,無需任何遞歸性(發表意見如果塊),使應用程序崩潰反正。
把它變成非虛擬的使它工作,但在這種情況下功能是無用的,所以我有點失落。爲什麼會崩潰?
編輯10/03:增加了SSCCE here。基於Synxis代碼。在我的電腦上使用Boost鏈接。所以我想這確實與我們的應用程序環境有關。
它如何崩潰?調試告訴你什麼?你能證明你是如何稱呼它的嗎?理想情況下,提供[SSCCE](http://www.sscce.org/)。 – Angew
不相關,但你的'if(!baseList.empty())'行是完全多餘的。 –
@Angew:由於使用某些.dll,調試在項目中不起作用。我得到的唯一錯誤是「無效句柄」。 – eMixam