运算符重载的c ++多态性

has*_*san 10 c++ polymorphism abstract-class operator-overloading

如何使纯虚函数成为运算符+(); 功能.whehı在基类int operator +()= 0中这样做; 编译器给出错误.在派生类运算符+()函数编译器中说派生类不能使.因为下面的类是抽象的,我知道我不能创建抽象类的对象,但现在我尝试创建派生类对象.

这是代码

#include <iostream>
using namespace std;
class ana {
    protected :
    int x;

    public :
    virtual int operator+()=0;
    virtual void operator=(ana&)=0;
    };

class baba : public ana{
    public:
    baba(int k){x=k;}
    int   operator+(baba &ali){
        int k;
        k=x+ali.x;
        return k;
    }
   void operator=(baba &ali){
       x=ali.x;
       }


    };

int main(){
    baba k(4);

    return 0;
    }
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 11

你模糊的代码提到基本上是不可能的.回答你的问题"我如何使纯虚函数成为算子+();函数",这绝对没有秘密,例如考虑以下琐碎的程序:

#include <iostream>

class base {
public:
  virtual int operator+(int) const = 0;
};

class deriv: public base {
public:
  int operator+(int) const {return 23;}
};

int main() {
  deriv d;
  base& b = d;
  std::cout << b + 15 << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这编译并运行得很好,23并按预期发出.无论你做错了什么,显然它必须与此不同(并且可能与将操作符重载为纯虚拟的特定问题无关).

编辑 :(根据评论,添加const到方法中以防万一你想要调用它const base&- 注意其他答案也省略了这个const;并且,每个评论也是如此):

如果你也想做15 + b,只需为此目的添加一个独立的功能,比如说main:

inline int operator+(int i, const base&b) {
    return b + i;
}
Run Code Online (Sandbox Code Playgroud)

  • 这有一个明显的缺点,即"15 + b"不起作用. (2认同)
  • 更糟糕的是(没有什么能阻止你重载`operator +(int,base)`来调用`operator +(base,int)`),当`b`是`const b&`时,这不起作用.虽然我确信亚历克斯知道如何处理这个问题,但在回答显然是C++的新手时却很难找到. (2认同)

Kor*_*icz 5

如果要搜索标准的operator +()实现,那么很遗憾,这是不可能的:

class X { 
public:
     virtual X operator+(X const &rhs) = 0;
};
Run Code Online (Sandbox Code Playgroud)

该代码无法编译,因为编译器无法按值返回抽象X类。

  • 可以将X *或智能指针返回给X。地狱,他可以编写自己的智能指针类,实际上只是一个std :: shared_ptr并以此方式解决。 (3认同)

Jer*_*fin 0

纯虚函数的语法类似于:

class X { 
public:
     virtual int operator+(X const &rhs) = 0;
};
Run Code Online (Sandbox Code Playgroud)

但请注意,您很少需要这样做——您通常希望将 的重载operator+实现为自由函数,以允许转换左操作数(如果需要)。