расширить метод базового класса, указав параметры по умолчанию - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы определить метод в базовом классе, а затем указать некоторые параметры по умолчанию, чтобы переопределить его в производном классе. Рассматриваемый параметр является указателем на функцию, и функция, на которую он указывает, сама является функцией базового класса, которую я переопределяю в производном классе. Если я просто укажу параметр, который запрашивает другое определение, мне будет интересно, есть ли способ избежать добавления дополнительных определений.

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);
};

1 Ответ

0 голосов
/ 07 апреля 2020

Вам нужно добавить определение, но вы можете просто перейти к базовому классу:

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, а не Тип Dynami c, который может сбивать с толку:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...