我在公共递归中调用受保护的虚函数时遇到问题。
我想要的是一个 Base 类,它调用递归函数 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();
};
基本上应用程序调用 getAllStrings() ,除了调用 getString() ,这会使应用程序崩溃。
简单地调用 getString() 函数而没有任何递归(注释 if 块)会导致应用程序崩溃。
将它设置为非虚拟使其工作,但在这种情况下该功能是无用的,所以我有点迷失。为什么会崩溃?
编辑10/03:添加了SSCCE here。基于Synxis代码。在Boost链接的计算机上运行。所以我想它确实与我们的应用程序环境有关。
答案 0 :(得分:0)
我终于解决了这个问题。
我跟DrMinGW做了一个跟踪,显示在ntdll.dll!RtlUlonglongByteSwap
但是,该功能没有使用任何信号。
这是罪魁祸首:
//在“base.hpp”文件中
protected:
/// Some useful type definition for the signal to emit when the
/// configuration changes.
typedef boost::signals2::signal<void ()> OnConfigurationUpdated;
virtual std::string getString()
{
return "";
}
public:
/// Signal that subscribers have to connect to if they want to be alerted
/// about the configuration changes.
OnConfigurationUpdated reactOnChanges;
项目使用另一个项目序列化,从中导入类。但是,此项目未使用GUI重建。从Serialization项目中正确清理(删除.o和.dll文件)使其正常工作。