c++中的操作符重载和多态性
Operators overloading and polymorphism in C++
我正在用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 '中是纯的:备注:virtual Number Number::operator+(Number)
我确信我能做到这一点,但到目前为止我还不知道怎么做。你能帮我一点忙吗?div;)
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;
}
注意,在某些情况下,返回对静态对象的引用可能会让您感到惊讶,请参阅注释。
另外,多态性可能不是最适合您要做的事情,例如,
你真的需要记录那些你不知道它们是什么类型的数字吗?
如果你真的想要多态性,智能指针可能应该伴随解决方案
相关文章:
- 将多态性与运算符 + 重载模板化类结合使用.如何实现基类?
- C++模板方法重载和具有多态性的类访问
- C++ 中多态性和函数重载之间的区别
- 如何用复数和多态性重载运算符
- 正确执行运算符重载和多态性
- 多态性和方法重载在C++中几乎是一样的
- 在C++中创建一个具有多态性和操作重载的模板
- 如果重载函数仅被部分重写,则多态性不起作用
- 动态多态性和运算符重载的真实示例
- C++运算符重载和多态性
- 具有不同签名的多态性和重载函数
- C++:多态性和运算符重载
- c++中的多态性和运算符重载混淆
- c++中的操作符重载和多态性
- 重载父函数是否会规避多态性?
- c++中的动态多态性和函数重载
- Operator=带多态性的重载
- c++多态性和重载
- 重载运算符[]多态性
- C++强制运算符重载和多态性