我有一个基类
class DLL_IMPORTEXPORT Base
{
public:
explicit Base(Base *parentItem = NULL);
virtual ~Base();
virtual bool initFromXml(const pugi::xml_node &xml_node);
//....
};
以及派生类
class DLL_IMPORTEXPORT Derived : public Base
{
public:
Derived(Base *parentItem = 0);
~Derived();
bool initFromXml(const pugi::xml_node &xml_node);
//...
};
现在我想调用基类方法
virtual bool initFromXml(const pugi::xml_node &xml_node);
来自派生类方法
bool Derived::initFromXml(const pugi::xml_node &xml_node)
{
bool all_ok = false;
// .... do some specific things
// then run the base class method
all_ok = all_ok && Base::initFromXml(xml_node);
return all_ok;
}
这一切都很好,但是,当我执行代码时,基类methode没有被执行,当我尝试在调试器中进入它时,它不会进入它而只是忽略它。我有点困惑。我的脑子在哪里?
答案 0 :(得分:7)
表达式:
all_ok && Base::initFromXml(xml_node)
使用具有短路评估的逻辑运算符&&
,即:如果all_ok
为假,则Base::initFromXml()
不会被调用,因为整个表达式的结果可以确定:false。
如果您真的想要调用Base::initFromXml()
而不管all_ok
的值,那么您可以在上面的表达式中交换操作数的顺序,即:
Base::initFromXml(xml_node) && all_ok
或在单独的语句中调用该函数并保存其返回值:
...
bool res_init = Base::initFromXml(xml_node);
all_ok = all_ok && res_init;
正如this comment中所建议的,使用按位和 - 运算符(&
)而不是逻辑和 - 运算符({{1也是一个解决方案,因为它不会短路:
&&