如何避免重新声明子方法并仍然为不同的子类定义不同的方法?

时间:2017-07-17 13:23:01

标签: c++ inheritance virtual

目前,我有一个父类和Setplay.h中声明的2个子类,因此

namespace agent {

class Setplay {
public:
    virtual int reset() {return 0;};
};

class ChildSetplay1 : public Setplay {
public:
    virtual int reset();
};

class ChildSetplay2 : public Setplay {
public:
    virtual int reset();
};

}

Setplay.cpp中,我定义了方法

namespace agent {

int ChildSetplay1::reset(){
    return 1;
}

int ChildSetplay2::reset(){
    return 2;
}

}

有没有办法避免重新声明.h中的方法,并为每个孩子定义独特的方法?

如果我避免重新声明.h中的方法:

namespace agent {

class Setplay {
public:
    virtual int reset() {return 0;};
};

class ChildSetplay1 : public Setplay {};
class ChildSetplay2 : public Setplay {};

}

然后我收到以下错误:

  

错误:没有在'agent :: ChildSetplay1'中声明的'int agent :: ChildSetplay1 :: reset()'成员函数

但如果我将方法的签名更改为

,我无法为每个孩子定义不同的方法
int reset(){
    return ??; // return 1? 2?
}

我不确定是否有办法做到这一点,但我的动机是:

  • 实际的课程有几种方法,并且一直重新声明一切看起来很丑陋

  • 我仍然需要将所有内容保留在.cpp.h

那么,是否可能?或者有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

您需要为每个孩子定义该功能,因此您无法逃避这一点。你可以做的是,如果你有多个功能,可以使用#define 像:

#define SET_PLAY_FUNCTIONS public:\
                           virtual int reset();\
                           virtual int go(); 
namespace agent {

class Setplay {
public:
    virtual int reset() {return 0;};
    virtual int go();
};

class ChildSetplay1 : public Setplay {
    SET_PLAY_FUNCTIONS
};

class ChildSetplay2 : public Setplay {
    SET_PLAY_FUNCTIONS
};

}

至少你可以节省一些东西......