开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
cygwin64
问题(Question):
最近正在省思我要把C++定位成怎样的工具
C++的多功能的确很容易导致误用
现在写C++时我都会把"避免过度设计"这句话放在心中
以上都是题外话,我要向各位请教的是C++技术上的问题
之所以说上面这些屁话,是因为这个问题是在思索上面的哲学问题而发现的
下方的程式码,类A定义了operator*和operator+
类B继承自类A,因为方便直接沿用类A的operator+,但定义了自己的operator*
最后在main函数中宣告两个B实例b1和b2,并执行(b2+b1)*3.0
直观上会以为operator*是调用类B的
但事实上是调用类A的,因为在执行operator+时回传的是A reference
想请问C++老手,这样的问题是用什么方法解决?
做type conversion,多型,还是单纯不要乱用operator overload?
程式码(Code):(请善用置底文网页, 记得排版)
#include <iostream>
using namespace std;
class A
{
public:
A& operator+(const A& rhs){cout<<"A& A::operator+(const A&)\n";}
A& operator*(const double& rhs){cout<<"A& A::operator*(const double&)\n";}
};
class B: public A
{
public:
B& operator*(const double& rhs){cout<<"B& B::operator*(const double&)\n";}
B& operator=(const A& rhs){cout<<"B& B::operator=(const A&)\n";}
B& operator=(const B& rhs){cout<<"B& B::operator=(const B&)\n";}
};
int main()
{
B b1, b2;
b1=(b2+b1)*3.0;
/*
output:
A& A::operator+(const A&)
A& A::operator*(const double&)
B& B::operator=(const A&)
*/
}
作者: HudsonE 2014-06-08 15:43:00
virtual
作者:
Feis (永远睡不着 @@)
2014-06-08 15:48:00要先想清楚你这么做的实际情境是什么? 为什么你可以偷懒.
作者: HudsonE 2014-06-08 15:49:00
嗯... 楼上的说法才正确 xDD
当你覆载加减乘除,表示这个type能像数字那样运算但数学运算子只能接受相同的type运算一旦你混用继承表示不同type也能相加,就背离常识了因此这时候就不该用operator+而是另一个function因为这个加法与数学上的加法在基本概念上就不一样了(当然operator+的确可以是virtual,但通常不会这样搞)
恩感谢michael0728n的回答会想这样做,是因为认为物件导向就是可以沿用code每次继承了一个类,想再沿用该类的operator都会出现问题,想说我该不会每继承一次,operator都要重写吧看来是误会operator overload的设计目的感谢littleshan导正观念
它是继承一个 object * double 所以我是觉得还好啦不过还是看使用情境就是XD
每次我看到operator+-*/我都会想 真的有必要吗 XD有些是受c#的影响 把register event写成operator+=这种code老实讲看几次都觉得怎么看怎么怪....
[题外话] C# 的 event 设计根本莫名奇妙...
他的event其实基本上跟boost::signal2完全同出一辄只是写法变得很奇怪而已 我第一次看到有人在C++用+=来注册的时候就把他叫过来问 果然是学C#的 OTZ不过后来看到这样写的人越来越多 好吧 当作业界惯例好了
集合用+-描述还算正常吧没有operator+-*/ 读写向量运算会想杀人XD