除
operator=
之外的所有基類運算子都會自動繼承
,但它們操作的都是子類中「基類的成員」
,即,如果x和
y都有int成員
i,(y沒有重寫++這個操作符)則
y y;++y;
加的是x中的i
,而不是y中的
i;同理operator==
的意義也不會檢測y中的
i。#include
using
namespace
std;
class
a1public
:int
operator
=(inta)
intoperator
+(inta)
};class
b1:
public
a1int
operator
-(inta)
b1():
i(6){}
inti;};
intmain
()「賦值運算子過載函式」不能被繼承
1,每乙個類物件例項在建立的時候,如果使用者沒有定義「賦值運算子過載函式」,那麼,編譯器會自動生成乙個隱含和預設的「賦值運算子過載函式」。所以,b1的實際上的宣告應該類似於下面這種情況:
class a1
int operator+(int a)
};class b1 : public a1
};2,c++標準規定:
如果派生類中宣告的成員與基類的成員同名,那麼,基類的成員會被覆蓋,哪怕基類的成員與派生類的成員的資料型別和引數個數都完全不同。
顯然,b1中的賦值運算子函式名operator =和基類a1中的operator =同名,所以,a1中的賦值運算子函式int operator=(int a);被b1中的隱含的賦值運算子函式b1& operator =(const b1& robj);所覆蓋。 a1中的int operator=(int a);函式無法被b1物件訪問。
3,程式中語句
v = 2實際上相當於v.operator =(2);
,但是a1中的int operator=(int a);已經被覆蓋,無法訪問。而b1中預設的b1& operator =(const b1& robj);
函式又與引數2的整數型別不相符,無法呼叫。
4,為了確認b1中預設的b1& operator =(const b1& robj);函式的存在性,可以用以下**驗證:
b1 b;
b1 v;
v = b; // ok, 相當於呼叫v.operator =(b);
5,所以,「賦值運算子過載函式」不是不能被派生類繼承,而是被派生類的預設「賦值運算子過載函式」給覆蓋了。
運算子函式過載
1.運算子的本質是什麼?把運算子看作函式名,通過函式過載的方式為同乙個運算子實現不同規則的運算,故運算子過載的本質就是函式過載。2.怎樣進行運算子過載?運算子過載的函式名是由關鍵字operate和其後重要的運算子符號構成。運算子函式定義的一般格式如下 資料型別 operate 運算子符號 引數列表 ...
函式的運算子過載
運算子過載就是給運算子賦予乙個新的含義,可以在不同的情況下進行操作 class person 方法2 person operator person p 關鍵字operator 此時,你在main函式中定義person的兩個類物件p1和p2,p1 p2 的含義與p1.add p2 的含義是一樣的 運算...
C 運算子過載函式之成員運算子過載函式
5.2.3 成員運算子過載函式 在c 中可以把運算子過載函式定義為某個類的成員函式,稱之為成員運算子過載函式。1.定義成員運算子過載函式的語法形式 1 在類的內部,定義成員運算子過載函式的格式如下 函式型別 operator 運算子 形參表 2 成員運算子過載函式也可以在類中宣告成員函式的原型,在類...