運算子過載函式的繼承問題

2022-03-15 21:58:23 字數 1355 閱讀 9264

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 成員運算子過載函式也可以在類中宣告成員函式的原型,在類...