[問題] 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