我写了以下代码:
class DoubleClass;
class IntClass;
class Number {
public:
virtual Number& addInt(IntClass& x)=0;
virtual Number& addDouble(DoubleClass& x)=0;
virtual Number& operator+(Number& x) = 0;
};
class IntClass : public Number {
private:
int num;
public:
IntClass(int num) : num(num) { }
Number& addInt(IntClass& x) { return x; }
**Number& addDouble(DoubleClass& x) { return x; }**
Number& operator+(Number& x) { return x; }
};
class DoubleClass: public Number {
private:
double num;
public:
DoubleClass(double num) : num(num) {}
double get_number() { return num; }
Number& addInt(IntClass& x) {
return x;
}
Number& addDouble(DoubleClass& x) { return x; }
Number& operator+(Number& x) { return x; }
};
感谢迭戈塞维利亚,我做了你所说的并且有效。 还有一个问题,我应该写这个函数: 号码和放大器;添加(数字& x,数字& y) 实现它的唯一方法是为所有可能性执行x和y的dynamic_cast(将x和y转换为int,如果抛出异常,则将x转换为double,将y转换为double,依此类推),或者是否存在一个更简单的方法?
答案 0 :(得分:11)
此时,编译器不知道DoubleClass
继承自Number
。您应该将类声明与方法实现分开。例如:
class IntClass : public Number {
// ...
Number& addDouble(DoubleClass& x); // Note: no implementation
};
class DoubleClass : public Number
{
// ...
};
inline Number& IntClass::addDouble(DoubleClass& x) { return x; } // Won't fail now
答案 1 :(得分:1)
您尚未定义DoubleClass
,因此除了获取对象的地址并将其传递之外,您无法对引用执行任何操作。