如果我有一个抽象类如下:
class Base{
public:
// some pure virtual functions
bool operator< (Base &other) const { return str < other.str; }
private:
string str;
};
如果派生类也像基类一样进行比较(运算符小于函数将与Base类相同),是否可以使用继承或虚函数来实现此目的?
答案 0 :(得分:4)
您无需执行任何操作,因为名称查找会在基类中找到operator<
但是,将运算符定义为非成员friend
函数是可行的。即。
friend bool operator< (Base const& lhs, Base const& rhs)
{
return lhs.str < rhs.str;
}
答案 1 :(得分:3)
你不需要做任何特别的事情。运算符的继承与任何其他成员函数一样:
#include <string>
using namespace std;
class Base
{
private:
string str_;
public:
auto operator<( Base const& other ) const
-> bool
{ return str_ < other.str_; }
};
class Derived: public Base {};
auto main() -> int
{
Derived d1, d2;
d1 < d2;
}
顺便说一句,请注意,不会通过隐式转换为左侧参数的Derived
或Base
来调用此运算符。
这是二元运算符最好被定义为非成员的主要原因。
但是,请注意,作为非成员,如果左正式参数是对非const
的引用(与例如operator<<
一样),那么它需要一个右值引用版本的顺序绑定到临时实际参数,如果需要的话。
将运算符定义为非成员但内联的一种非常罕见的方法是使用friend
机制,如下所示:
#include <string>
using namespace std;
class Base{
private:
string str_;
public:
friend
auto operator<( Base const &a, Base const& b )
-> bool
{ return (a.str_ < b.str_); }
};
class Derived: public Base {};
struct Convertible { operator Base () const { return Base(); } };
auto main() -> int
{
Derived d1, d2;
d1 < d2;
Convertible conv;
conv < d2;
}
但请注意,使用此方法,只能通过参数依赖查找,ADL找到运算符。
答案 2 :(得分:0)
我想Eastwood先生对帖子的一些评论/澄清:)可能有意义:因为运算符成员函数在派生类中与基类完全相同(即比较相同的数据成员) ,你可以按原样使用它,而不是覆盖。
您必须覆盖的唯一成员函数是纯虚函数。
实际上,由于此成员函数未标记为virtual
,因此您无法清晰地覆盖它。
希望能够解决问题!