派生類如果有與直接基類同名變數或函式(不論訪問控制關鍵字是否相同),對於同名變數,其會覆蓋直接基類對應的同名變數變數。(下面會講到"覆蓋"一詞並不準確,個人深受其害)
對於同名函式,則覆蓋直接基類對應同名的所有函式,包括所有過載。也就是乙個派生類的直接基類和間接基類,它們之間不可能形成函式過載。
如:
#includeusing namespace std;
class a
{protected:
char a='a';
public:
void show(char a)
{cout《編譯會出錯。
但是,被覆蓋掉的變數或函式,仍然可以通過作用域解析運算子(::)來呼叫
。如果對以上**的類 c 和 main 函式進行如下改動:
class c:public b
{public:
void show()
{a::show(a::a);
cout《則輸出為
abc
所以直接說派生類的同名函式會"覆蓋"基類裡的同名函式不負責任的說法,更確切的說法是"隱藏",因為沒有實際消失。
既然沒有實際消失,如果沒有出現同名隱藏,那麼派生類所繼承的基類中的函式能訪問的成員的永遠只能是它所在的類和它所在類的所有基類(直接基類和間接基類)內的成員,不會出現基類函式訪問派生類成員的情況。
如果虛函式同名,我們不考慮虛函式和非虛函式同時存在於乙個類中且同名的情況,實際程式設計用不上(個人想法),所以如果只考慮虛函式存在,對於虛函式過載,擁有和非虛函式一樣的同名隱藏。但是虛函式過載中,如果函式原型不完全相同,那麼不能認為給乙個函式前面加了virtual所有同名函式(基類和所有派生類中)都是虛函式,必須得在每個不同原型首次出現的位置新增virtual。
例子不舉了。
建議了解虛函式表。
C 子類和父類同名成員變數或函式
在c 中子類和父類同名成員時候c 版本不同處理的方式也不同。下面是我使用visual c 2015 update 3的測試結果 測試 如下 include using namespace std class base virtual void print base class public base...
C 中類繼承和虛函式
1.類繼承的書寫格式 class classname access label base class access label 是public protected 或private base class 是基類或父類。classname 是派生類或子類。2.虛函式 在c 中,基類中定義為 virtu...
C 中類成員函式指標的繼承
c 中的成員函式指標 member function pointer 提供了對類成員函式進行動態訪問的機制。比如定義如下的類 class base 那麼可以定義成員函式指標 void base mfp base basefunc 並且通過下面的語句執行basefunc 函式 base baseobj...