在派生类中使用抽象类的重载运算符

时间:2014-11-21 21:58:58

标签: c++ inheritance polymorphism abstract-class

如果我有一个抽象类如下:

class Base{
public:
  // some pure virtual functions
  bool operator< (Base &other) const { return str < other.str; }
private:
  string str;
};

如果派生类也像基类一样进行比较(运算符小于函数将与Base类相同),是否可以使用继承或虚函数来实现此目的?

3 个答案:

答案 0 :(得分:4)

您无需执行任何操作,因为名称查找会在基类中找到operator< 但是,将运算符定义为非成员friend函数是可行的。即。

friend bool operator< (Base const& lhs, Base const& rhs)
{
    return lhs.str < rhs.str;
}

Demo

答案 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;
}

顺便说一句,请注意,不会通过隐式转换为左侧参数的DerivedBase来调用此运算符。

这是二元运算符最好被定义为非成员的主要原因。

但是,请注意,作为非成员,如果左正式参数是对非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,因此您无法清晰地覆盖它。

希望能够解决问题!