[问题] C++运算子重载和继承合用,会导致混乱

楼主: frankhsu421 (问号)   2014-06-08 14:25:11
开发平台(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&)
*/
}
作者: michael0728n (蒜˙远古)   2014-06-08 15:24:00
virtual? not surehttp://codepad.org/Q3jeV3L9 希望有帮助
作者: HudsonE   2014-06-08 15:43:00
virtual
作者: Feis (永远睡不着 @@)   2014-06-08 15:48:00
要先想清楚你这么做的实际情境是什么? 为什么你可以偷懒.
作者: HudsonE   2014-06-08 15:49:00
嗯... 楼上的说法才正确 xDD
作者: diabloevagto (wi)   2014-06-08 15:59:00
四楼的意思是?!
作者: littleshan (我要加入剑道社!)   2014-06-08 16:25:00
当你覆载加减乘除,表示这个type能像数字那样运算但数学运算子只能接受相同的type运算一旦你混用继承表示不同type也能相加,就背离常识了因此这时候就不该用operator+而是另一个function因为这个加法与数学上的加法在基本概念上就不一样了(当然operator+的确可以是virtual,但通常不会这样搞)
楼主: frankhsu421 (问号)   2014-06-08 16:30:00
恩感谢michael0728n的回答会想这样做,是因为认为物件导向就是可以沿用code每次继承了一个类,想再沿用该类的operator都会出现问题,想说我该不会每继承一次,operator都要重写吧看来是误会operator overload的设计目的感谢littleshan导正观念
作者: michael0728n (蒜˙远古)   2014-06-08 16:48:00
它是继承一个 object * double 所以我是觉得还好啦不过还是看使用情境就是XD
作者: Killercat (杀人猫™)   2014-06-08 19:57:00
每次我看到operator+-*/我都会想 真的有必要吗 XD有些是受c#的影响 把register event写成operator+=这种code老实讲看几次都觉得怎么看怎么怪....
作者: diabloevagto (wi)   2014-06-08 20:22:00
这样写满方便的啊xdd
作者: littleshan (我要加入剑道社!)   2014-06-09 01:54:00
[题外话] C# 的 event 设计根本莫名奇妙...
作者: Killercat (杀人猫™)   2014-06-09 12:45:00
他的event其实基本上跟boost::signal2完全同出一辄只是写法变得很奇怪而已 我第一次看到有人在C++用+=来注册的时候就把他叫过来问 果然是学C#的 OTZ不过后来看到这样写的人越来越多 好吧 当作业界惯例好了
作者: azureblaze (AzureBlaze)   2014-06-09 13:23:00
集合用+-描述还算正常吧没有operator+-*/ 读写向量运算会想杀人XD

Links booklink

Contact Us: admin [ a t ] ucptt.com