目錄
二、同名函式隱藏與虛函式覆蓋
類的關係圖:
派生類的作用域巢狀在基類之內
bulk_quote bulk;
cout<< bulk.isbn();
名字isbn解析過程:
成員名字的查詢型別由靜態型別決定
//給disc_quote新增乙個成員,返回折扣政策
class disc_quote : public quote
protected:
int mem;
};struct derived : base;
int get_mem()
protected:
int mem;
};
get_mem
返回的是在derived中的mem
derived d(42);
cout派生類函式形式
與基類同名函式的關係
形參列表
繫結方式
非虛函式
隱藏基類同名函式
可相同可不同
靜態繫結
虛函式覆蓋基類虛函式
必須相同
動態繫結
使用基類的引用或指標呼叫虛函式時,會發生動態繫結
當派生類有基類的同名虛函式且該函式不是虛函式時,無論兩個同名函式的引數是否相同。
//情況1舉例
class a;
class d1 : public base;
class d2 : public d1;
//呼叫虛函式的例子
//fcn是base中的虛函式
//d1直接繼承base的虛函式fcn
//d2過載了base的fcn
base bobj;
d1 d1obj;
d2 d2obj;
base *bp1 = &bobj, *bp2 = &d1jobj, *bp3 = &d2obj;
bp1->fcn(); //虛呼叫:執行時執行base::fcn
bp2->fcn(); //虛呼叫:執行時執行base::fcn
bp3->fcn(); //虛呼叫:執行時執行d2::fcn
//f2是d1中的虛函式
//base中沒有定義f2
//d2過載了d1的虛函式f2
d1 *d1p = &d1obj;
d2 *d2p = &d2obj;
bp2->f2(); //錯誤:base物件中沒有名為f2的成員
d1p->f2(); //虛呼叫:執行d1::f2()
d2p->f2(); //虛呼叫:執行d2::f2()
//呼叫非虛函式的例子
//fcn(int)是d1中的 非虛函式
//base中沒有定義fcn(int)
//d2中的fcn(int)隱藏了d1中的fcn(int)
base *p1 = &d2obj; //d2obj是d2型別的物件
d1 *p2 = &d2obj;
d2 *p3 = &d2obj;
p1->fcn(42); //錯誤:base中沒有接受int的fcn
p2->fcn(42); //靜態繫結:呼叫d1::fcn(int)
p3->fcn(42); //靜態繫結:呼叫d2::fcn(int)
虛函式與派生類過載
這裡不講虛函式的定義了 直接進入主題,就是過載。如果基類宣告了乙個函式是虛函式,而且派生類並沒有改變引數,只是把函式內容改變了,那麼這個可以認為是 重寫 派生類過載是什麼呢,就是在派生類中僅僅保留基類的函式名,引數變了,或者返回型別也變了,如果不改變引數僅僅改變返回型別不是過載,這樣也是錯的。如果過...
C 虛繼承派生類建構函式的寫法
普通的繼承中,我們可以在當前類 c 建構函式的初始化表中指明如何去構造直接父類 b 然後在該父類 b 建構函式的初始化表中指明如何構造祖先類 a class a a int d data d private int data class b public a b int x a x class c ...
虛函式 與派生類遮蔽基類函式
class base public virtual void print void cout 10public void print int i cout base iter new dervied iter print 5 基類指標會在基類物件中尋找函式,找到函式名後,判斷引數,沒有乙個引數的,所...