通过指定默认参数扩展基础 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
我想在基础 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