C 繼承 同名隱藏 覆蓋,虛函式

2021-06-22 08:25:44 字數 2701 閱讀 3081

不同作用域宣告的識別符號的可見性原則:

如果存在兩個或多個具有包含關係的作用域,外層宣告了乙個識別符號,而內層沒有再次宣告同名識別符號,那麼外層識別符號在內層依然可見,如果在內層宣告了同名識別符號,則外層識別符號在內層不可見,這時稱內層識別符號隱藏了外層同名識別符號,這種現象稱為隱藏規則。

在類的派生層次結構中,基類的成員和派生類新增的成員都具有類作用域。二者的作用範圍不同,是相互包含的兩個層,派生類在內層。這時,如果派生類宣告了乙個和某個基類成員同名的新成員,派生的新成員就隱藏了外層同名成員,直接使用成員名只能訪問到派生類的成員。如果派生類中宣告了與基類同名的新函式,即使函式的參數列不同,從基類繼承的同名函式的所有過載形式也都被隱藏。如果要訪問被隱藏的成員,就需要使用類作用域分辨符和基類名來限定。

作用域分辨符,就是"::",它可以用來限定要訪問的成員所在的類的名稱。一般的使用形式是:

類名::成員名

類名::成員名(參數列)

關於同名隱藏的驗證:

由結果可知已經不能直接從b的物件中直接用函式名訪問print2()了。

將b.print2();  改為: b.a::print2();

可見能利用域分辨符來定位繼承自a被隱藏的print2()函式。

除了利用域分辨符定位繼承自基類並被派生類隱藏的成員以外,還可以利用using關鍵字加以說明。

using的一般功能是將乙個作用域中的名字引入到另乙個作用域中,它還有乙個非常有用的用法:將using用於基類中的函式名,這樣派生類中如果定義同名但引數不同的函式,基類的函式將不會被隱藏,兩個過載的函式將會並存在派生類的作用域中。

**2:

[cpp]view plain

copy

#include

using

namespace

std;  

class

a    

};  

class

b:public

a    

};  

intmain()  

編譯執行:

虛函式與執行時多型:

型別相容規則:在需要基類的任何地方,都可以使用公有派生類的物件來替代。通過公有繼承,派生類得到了基類中除建構函式、析構函式之外的所有成員。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。

型別相容規則中所指的替代包括以下的情況:

派生類的物件可以隱含轉換為基類物件。

派生類的物件可以初始化基類的引用。

派生類的指標可以隱含轉換為基類的指標。

在替代之後,派生類物件就可以作為基類的物件使用,但只能使用從基類繼承的成員。

**3中的new b()返回乙個指向b物件的指標,之後隱式轉換為指向a的指標a,因為a是指向a類物件的指標,因此可以用a來訪問繼承自a的類b的物件,但是a只能使用繼承自a的成員。

根據賦值相容規則,可以使用派生類的物件替代基類物件。如果用基類型別的指標指向派生類物件,就可以通過這個指標來訪問物件,問題是訪問到的只是從基類繼承來的同名成員。解決這一問題的方法是:如果需要通過基類的指標指向派生類的物件,並訪問某個與基類同名的成員,那麼首先在基類中將這個同名函式說明為虛函式。這樣,通過基類型別的指標,就可以使屬於不同派生類的不同物件產生不同的行為,從而實現執行過程的多型。

將**3稍作修改:

虛繼承 過載 覆蓋 隱藏

關於c 中的虛擬繼承的一些總結 1.為什麼要引入虛擬繼承 虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現的。如 類d繼承自類b1 b2,而類b1 b2都繼承自類a,因此在類d中兩次出現類a中的變數和函式。為了節省記憶體空間,可以將b1 b2對a的繼承定義為虛擬繼承,而a就成了虛擬基類...

C 虛函式 過載與覆蓋 虛繼承

1.什麼是虛函式 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現一共同的方法,但因個體差異而採用不同的策略。虛函式主要通過虛函式表 v table 來實現...

隱藏和覆蓋 多型 虛函式 C

隱藏 overhide 派生類中隱藏了基類中所有的同名函式 同名 不同參 繼承關係下的不同作用域 覆蓋 派生類中同名同參的虛函式覆蓋基類中同名同參的虛函式 同名同參 繼承關係下的不同作用域 均為虛函式 隱藏 class base void show protected int ma class de...