我正在学习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;
}
答案 0 :(得分:-1)
你做错了。直接的错误来源是n
和m
都是指针,而成员operator+
则希望调用对象。
理论上,你可以执行双重调度(否则语法会很难看):
// define operator+ as a free function
Number* operator+(Number* lhs, Number* rhs) {
return lhs->operator+(rhs);
}
但是,虽然将lhs
调用plus将被虚拟调用,rhs
将保持抽象类型。除非你dynamic_cast
执行它,否则你将无法弄清楚它是什么 - 这只是丑陋的。通常,您的示例根本不是动态多态的好例子。