C 派生類函式過載與虛函式繼承詳解

2022-10-03 22:00:27 字數 1977 閱讀 2062

目錄

二、同名函式隱藏與虛函式覆蓋

類的關係圖:

派生類的作用域巢狀在基類之內

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 基類指標會在基類物件中尋找函式,找到函式名後,判斷引數,沒有乙個引數的,所...