我正在为C ++中的基本数字类型编写一个简单的包装。
我想要一个抽象的基类Number和一些派生类,例如Short,Integer,Long和Double。
为了使Number类成为抽象类,我需要声明一些对于所有数字类型都通用的纯虚方法,例如基本运算符(+,-,*,/):
class Number {
public:
[...]
virtual Number operator+(Number) = 0;
virtual Number operator-(Number) = 0;
virtual Number operator*(Number) = 0;
virtual Number operator/(Number) = 0;
[...]
}
但是,当我尝试在派生类中使用具体类型的操作符来实现该操作符时,恐怕这将无法正常工作:
class Integer : public Number {
public:
[...]
Integer operator+(Integer);
Integer operator-(Integer);
Integer operator*(Integer);
Integer operator/(Integer);
[...]
}
当我尝试编译此代码时,我收到以下消息:
Number.hpp错误:无法将参数“ anonymous”声明为抽象类型“ Number”注意:因为以下虚拟函数在“ Number”中是纯净的:注意:虚拟Number Number :: operator +(Number)
我敢肯定我可以做到,但是到目前为止我还不知道怎么做。你能帮我一下吗?;)
1)由于Number是抽象的,因此您必须返回一个引用(或指针)
2)参数也必须是引用(相同的原因)
3)派生类的参数必须相同
4)您缺少“虚拟”覆盖
这是一种可行的技巧:
class Number {
public:
virtual Number& operator+(const Number&) = 0;
};
class Integer : public Number {
public:
virtual Integer& operator+(const Number&) override;
private:
int i;
};
Integer& Integer::operator+(const Number& n)
{
static Integer i;
const Integer* param = dynamic_cast<const Integer*>(&n);
assert(param);
i.i = this->i + param->i;
return i;
}
注意,在某些情况下,返回对静态变量的引用会使您感到惊讶,请参阅注释。
另外,多态可能不是最适合您尝试做的事情,例如,
您是否真的需要跟踪数字,而又不知道数字是什么类型?
如果您真的想在这里使用多态,则智能指针可能应该与解决方案一起提供
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句