假设我有一个基类声明一个纯虚函数do_sth()采用向量,但在派生类中通常只使用具有单个元素的向量。 因此,为了方便起见,我想提供一个带有单个元素的do_sth()的第二个版本。我不想在每个类派生中实现第二个版本 来自Base,因为它的目的只是调用带矢量的版本。因此我的想法是在基类中实现它,如下所示:
class Base {
virtual void do_sth(const std::vector<int>& v) = 0;
void do_sth(int n) {
do_sth(std::vector<int>{n});
}
};
class Derived : public Base {
void do_sth(const std::vector<int>& v) override {
//do_sth with v
}
};
但是,这样一来,如果我的代码的用户想要调用带有单个元素的版本,他们必须通过指向基类的指针来完成它。 不是我想要的。
Derived* d = new Derived();
Base* b = new Derived();
d->do_sth(5); // compilation fails because Base::do_sth is hidden in Derived
d->do_sth({5}); // obviously works, but does not make use of convenience function
b->do_sth(5); // works, but requires the user to remember using a
// pointer to base, e.g. he can't write
// auto b = make_shared<Derived>(); b->do_sth(5);
d->Base::do_sth(5); // works, but requires the user to remember
// to explicitly call the base class function
我所知道的唯一其他选项是重新定义派生自Base的每个类中的便捷函数,如下所示:
void Derived::do_sth(int n) {
Base::do_sth(n);
}
或放
using Base::do_sth
在派生类中。 我不喜欢这个是我必须记住在每个类中编写redefinition / using语句 源于基地。
有人知道另一种可能更好的方法来实现我所寻求的功能吗?也许我应该选择另一种设计方案?