我可以从基类中调用一个从派生类返回bool的函数

时间:2016-05-31 07:56:15

标签: c++11 inheritance

我有以下基类:

class node_layer_manager_t : public layer_manager_t
{
protected:
    //Devices
    trx_t        trx;
private:
    std::vector<string>               trx_dump_labels;

public:
    node_layer_manager_t( xml::node_t& params ); 
    ~node_layer_manager_t();

    virtual bool    set_profile(void) override;    
}

我创建了以下派生类:

class node_layer_manager_with_rad_t : public node_layer_manager_t
{
protected:
    //Devices
    radio_t radio;

public:
    node_layer_manager_with_rad_t(xml::node_t& params );
    ~node_layer_manager_with_rad_t();

    virtual bool    set_profile(void) override;

    virtual void radio_monitoring_job_function(void);

    intervalues_t<double>   radio_tmp;
    ushort          duration_seconds_for_radio_monitoring;
};

我想要它,以便set profile将执行基类的set_profile以及其他一些其他操作。

我可以这样写吗?

bool node_layer_manager_with_rad_t::set_profile(void)
{
    bool success;
    node_layer_manager_t::set_profile();
    try
    {
        string_t profile_tag = "logs/trx_dump/node:"+get_id();
        dev_tx = profile->get_decendant(profile_tag.c_str());
        cout<<"sarit id= "<< get_id()<<endl;
        success = true;
    }
    catch(...)
    {
        cout<<"sarit  profile error: "<<endl;
        success = false;
    }
    return success;  //**
}

**或者我应该重新打开以下内容:

return (success && node_layer_manager_t::set_profile()); 

2 个答案:

答案 0 :(得分:1)

如果您必须调用父set_profile而不管您在派生类中需要做什么,您应该采用设计来处理此约束。

通常,您应将基于类set_porfile标记为final并管理基于类的专用派生类方法的调用:

class node_layer_manager_t : public layer_manager_t
{
protected: 
    ....
    // set_profile actions of derived class
    // proposed a default without side effect implementation if
    // derived class doesn't need to overload this.
    virtual bool set_profile_child() { return true; };
private:
    ....
public:
    .....
    // Manage here call of derived
    virtual bool set_profile() override final
    {
        // actions before derived specific actions
        ....
        // Call specific derived class actions
        bool success = set_profile_child();

        // actions after derived specific actions
        if (success)
        {
            //do based class action
        }
        return success;
    }
}

和孩子:

class node_layer_manager_with_rad_t : public node_layer_manager_t
{
protected:
    ....

public:

    virtual bool    set_profile_child() override;
};

// Manage only there own action, regardless of needs of based class
bool node_layer_manager_with_rad_t::set_profile(void)
{
    try
    {
        // Do what you're in charge, and only what you're in charge!
    }
    catch(...)
    {
        cout<<"sarit  profile error: "<<endl;
        success = false;
    }
    return success;  //**
}

通过这种设计,每个班级只做它必须管理的东西,而且只做它的。派生类不必处理基类的需求。

如果您希望为派生类提供能力来决定是否在通用行为之前或之后执行代码,您可以替换或添加set_profile_child()两种方法:bool pre_set_profile()bool post_set_profile()

答案 1 :(得分:0)

首先,你还没有在任何地方宣布成功(实际上,这不是mcve,代码不应该按原样编译)。

< S>

我仍然明白了 - 而且答案是:这取决于你真正想做的事情......

您想先调用超级类还是在子类代码之后调用它?你的例子意味着前者,你的另一种选择后者。如果超类函数失败或仍然执行代码,是否要中止?

您的初始示例调用超类函数,忽略结果并在之后执行自己的操作。

这首先调用超类函数,并仅在成功时继续:

bool success = node_layer_manager_t::set_profile();
if(success)
{
    try { /*...*/ } // <- no need to set success to true, it is already
    catch(...) { /*...*/ success = false; }
}

这两者都执行,但结合了结果:

bool success = node_layer_manager_t::set_profile();
try { /*...*/ } // <- do not modify success, must remain false if super class failed!
catch(...) { /*...*/ success = false; }

您的替代提示是先执行子类代码,只调用超类函数,如果没有出错。

这些方法中的任何一种都可能是适当的,它们都不是。您必须清楚地了解您的要求是什么 - 然后实施代码以满足您的需求......