關於繼承,函式的繼承

2021-06-28 13:20:49 字數 2440 閱讀 5369

1. 子類擁有了父類的public財產(私有成員其實也有,但是訪問不了),通過子類呼叫函式時,編譯器先在子類中找相應的函式,找不到的話再去父類找。

如此一來,如果父類和子類定義了一樣的函式(包括引數列表),子類的函式會覆蓋父類函式。

如果,父類定義了子類的同名函式,但是引數列表不同,子類的也會被覆蓋隱藏,如

果想通過子類呼叫父類的函式,需要顯示的說明,比如 b.a::***x(p1, p2)

#include

using namespace std;

class a

~a() {}

void print()

};class b: public a

~b() {}

void print()

};int main()

所以這段**輸出 this is a 和 this is b

2. 下面的**

#include

using namespace std;

class a

~a() {}

void print()

};class b: public a

~b() {}

void print()

};int main()

居然,輸出是 兩個 「this is a」。

3. 所以虛函式便應運而生,很好解決了同名函式繼承的多型問題。

#include

using namespace std;

class a

~a() {}

virtual void print()

};class b: public a

~b() {}

void print()

};int main()

輸出是  this is a 和 this is b

ps。虛函式的多型,嚴格按照函式名+引數名。也就是說子類和父類的函式名和引數都得完全一致。

而函式隱藏卻不需要這麼嚴格,只要函式名一樣的就隱藏函式。

覆蓋如果派生類覆蓋了基類中的成員函式或成員變數,則當派生類的物件呼叫該函式或

變數時是呼叫的派生類中的版本,當用基類物件呼叫該函式或變數時是呼叫的基類中的版本。

隱藏看下邊這個例子,b繼承a 為什麼main函式執行fun(x),fun(x,y)時編譯通不過

class a

void f(int i)

};class b:public a//private a

*/private: 

int a;

};int main()

其實很簡單

隱藏基類成員函式的情況:如果在派生類中定義了乙個與基類同名的函式,不管這個函式的引數列表是不是與基類

中的函式相同,則這個同名的函式就會把基類中的所有這個同名的函式的所有過載版本都隱藏了,這時並不是在派

生類中過載基類的同名成員函式,而是隱藏,比如類a中有函式f(int i,intj)和f(int i)兩個版本,當在從a派生出的類

b中定義了基類的f()函式版本時,這時基類中的fun(int i)和f(int i,int j)就被隱藏了,也就是說由類b建立的物件比如

為m,不能直接訪問類a中的f(int i)版本,即使用語句m.f(2)時會發生錯誤。

怎樣使用派生類的物件訪問基類中被派生類覆蓋或隱藏了的函式或變數:

方法 1 使用作用域運算子::,在使用物件呼叫基類中的函式或變數時使用作用域運算子即語句 m.a::f(2),這

時就能訪問基類中的函式或變數版本。注意,訪問基類中被派生類覆蓋了的成員變數只能用這種方法

方法 2 使用 using:該方法只適用於被隱藏或覆蓋的基類函式,在派生類的類定義中使用語句 using 把基類的

名字包含進來,比如using a::f;就是將基類中的函式f()的所有過載版本包含進來,過載版本被包含到子類之

後,這些過載的函式版本就相當於是子類的一部分,這時就可以用派生類的物件直接呼叫被派生類隱藏了的

基類版本,比如 m.f(2),但是使用這種語句還是沒法呼叫基類在派生類中被覆蓋了的基類的函式,比如 m.f()

呼叫的是派生類中定義的函式f,要呼叫被覆蓋的基類中的版本要使用語句m.a::f()才行。

在派生類的函式中呼叫基類中的成員變數和函式的方法:就是在函式中使用的被派生類覆蓋的基類成員變數或函式

前用作域解析符加上基類的類名,即a::f()就是在派生類的函式中呼叫基類中被派生類覆蓋了的函式f()的方法。

派生類以私有方式被繼承時改變基類中的公有成員為公有的方法:

使用::作用域運算子,不提倡用這種方法,在派生類的 public 後面用作用域運算子把基類的 公有成員包函進

來,這樣基類的成員就會成為派生類中的公有成員了,注意如果是函式的 話後面不能加括號 ,如a::f;如果

f是函式的話不能有括號

使用using語句,現在一般用這種方法,也是在派生類的public使用using把基類成員包函進來,如using a::f。

虛函式的三種繼承(普通繼承,虛函式繼承,虛繼承)

include using namespace std class a class b public a class c public virtual b int main cout b類,普通繼承,乙個整型4b,繼承下來的乙個整型4b,虛指標4b,共12b b類的虛函式表有aa與bb兩個虛函式位址...

關於公有繼承,保護繼承和私有繼承

假設現在有乙個名叫大地主的類,他有下面三個成員 公有成員 一塊空地 保護成員 傳家寶 私有成員 qq號 所謂公有成員,就是你可以和大地主商量,讓他把空地租給你,對外說的時候,你要說清楚你這個地是大地主的一塊空地,也就是 大地主.一塊空地傳家寶當然是只給其後代 派生類 的,其他人要用,看他賣不賣 提不...

關於繼承中的析構函式

class clxbase clxbase virtual void dosomething class clxderived public clxbase clxderived void dosomething int main clxderived p new clxderived 情況 clx...