通过指定默认参数扩展基础 class 方法

extend a base class method by specifying default parameters

我想在基础 class 中定义一个方法,然后指定一些默认参数以在派生 class 中覆盖它。有问题的参数是一个函数指针,它指向的函数本身是我在派生 class 中重写的基 class 函数。如果我只是指定参数,它会要求我提供其他定义,我想知道是否有办法避免添加更多定义。

class mover: public piece
{
public:
    mover(const char t);
    ~mover() { };
    virtual bool life_status(piece victim) = 0;
    void move(piece victim, size_t newr, size_t newc, bool(mover::*life_status)(piece));
};
class diplomat : public mover {
public:
    diplomat(const char t);
    ~diplomat() { };
    bool life_status(piece victim) { return victim.status(); }
    void move(piece victim, size_t newr, size_t newc, bool(mover::* life_status)(piece)= mover::life_status);
};
class necromobile : public mover {
public:
    necromobile(const char t);
    ~necromobile() { };
    bool life_status(piece victim) { return !victim.status(); }
    void move(piece victim, size_t newr, size_t newc, bool(mover::*life_status)(piece)= mover::life_status);
};

您需要添加定义,但您可以转发到基础 class:

void diplomat::move(piece victim,
                   size_t newr,
                   size_t newc,
                   bool(mover::* life_status)(piece)/*= mover::life_status*/)
{
    mover::move(victim, newr, newc, life_status);
}

请注意,使用除基数以外的其他值作为默认值是危险的,因为默认值将取决于 static_type,而不是动态类型,这可能会造成混淆:

diplomat d;
mover& m = d;

d.move(victim, newr, newc); // OK, default argument mover::life_status
m.move(victim, newr, newc); // ERROR, mover doesn't have default argument