抽象类重载算术运算符

时间:2016-03-28 16:11:10

标签: c++ pointers abstract-class pure-virtual

我正在学习c ++,而我正试图做一些多态和操作符重载,而且我遇到了一些问题。

我在这里做的是一个名为Number的抽象基类和一个名为MyInt的派生类,我需要重载operator +, - 以便使用MyInt个数字运算MyDouble个数字......等等。

在阅读了很多帖子之后,我遇到了这个错误error: invalid operands of types 'Number*' and 'Number*' to binary 'operator+' cout << n + m << endl;我该怎么做才能做到这一点?

我知道这可以使用模板,但我不能在这里使用它,因为这个练习的目的是创建类似MyStack<Number*>的东西来保存不同的数据类型

#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

class Number {
public:
    virtual Number* operator+(Number* n) = 0;
    virtual string toString() = 0;
    friend ostream& operator<<(ostream& os, Number* n){ 
        return os << n->toString();
    }
};

class MyInt: public Number{
public:
    int value;
    MyInt(int e){
        value = e;
    }
    virtual ~MyInt(){}
    int getNum(){ return value;}

    Number* operator+(Number* n){
        MyInt* a = (MyInt*) n;        
        return new MyInt(value + a->value);
    }

    string toString(){
        ostringstream oss;
        oss << value;
        return oss.str();
    }
 };

int main(int argc, char** argv) {
    Number* n = new MyInt(5);
    Number* m = new MyInt(3);

    cout << "N: " << n << endl;
    cout << "M: " << m << endl;


    cout << n + m << endl;

    return 0;
}

1 个答案:

答案 0 :(得分:-1)

你做错了。直接的错误来源是nm都是指针,而成员operator+则希望调用对象。

理论上,你可以执行双重调度(否则语法会很难看):

// define operator+ as a free function
Number* operator+(Number* lhs, Number* rhs) {
    return lhs->operator+(rhs);
}

但是,虽然将lhs调用plus将被虚拟调用,rhs将保持抽象类型。除非你dynamic_cast执行它,否则你将无法弄清楚它是什么 - 这只是丑陋的。通常,您的示例根本不是动态多态的好例子。