忽略c ++调用虚拟基函数

时间:2018-01-17 13:26:58

标签: c++

我有一个基类

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没有被执行,当我尝试在调试器中进入它时,它不会进入它而只是忽略它。我有点困惑。我的脑子在哪里?

1 个答案:

答案 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也是一个解决方案,因为它不会短路:

&&
相关问题