b是a: class b: public a
* b中函式不可訪問a的private成員,可訪問protect成員;
* 在b中訪問a中同名成員時,需使用『::』, eg. a::method1
* 建立b物件時會先呼叫a中建構函式,後呼叫b的建構函式。物件銷毀時順序相反。
* 定義b的建構函式:
class a;
...};class b: public a ;
...};
* public賦值相容規則:
派生類物件可賦值給基類物件(反過來不可):
eg. base b; derived d;
b = d; base &b = d; base *b = &d;
(如果派生方式不是public,則此規則不成立)
eg. virtual int get(), 可參與多型
* 建構函式和靜態成員函式不可為虛函式
* 【多型/polymorphism】
當通過乙個基類指標或引用呼叫基類和派生類同名虛函式時:
若該指標/引用指向乙個某個派生類物件,則被呼叫的是該派生類的虛函式(乙個派生類指標賦值給乙個基類指標);
若指向/引用乙個基類物件,則呼叫的是基類的虛函式。
(若基類指標呼叫非虛函式,則被呼叫的只能是積累中該函式)
class base
void virtual print2()
};class derived: public base
void virtual print2()
};int main()
輸出:
this is a print from base class
this is a virtual print from base class
this is a print from base class
this is a virtual print from derived class
this is a print from base class
this is a virtual print from derived class
#作用: 提高程式的可擴充性;
#實現原理:
每乙個有虛函式的類及其派生的類都會有乙個虛函式表,表中存放著該類每個虛函式對應的指標。該類在生成物件時,會生成乙個指向其虛函式表位址的指標(空間開銷會多四個位元組)。多型的實現,就是根據基類指標指向的物件中包含的這個指標指向的虛函式表找到相應的虛函式。->使用多太缺點:增加額外的時間和空間開銷
若某基類虛函式沒有被派生類過載,則此派生類虛函式表中會儲存基類的虛函式位址。
class base virtual method1()
virtual method2() ...
base b;
derived d;
base *p = d;
* 虛析構函式
如果乙個類中有虛函式,建議將析構函式也定義為虛函式,則可保證用基類指標指向派生類時,函式刪除此指標可先調動派生類析構,再呼叫基類析構函式。
& 建構函式不可定義為虛構函式
* 純虛函式:virtual void printinfo() = 0 (無函式體)
包含純虛函式的類為抽象類。
a. 抽象類只能做為基類;
b. 不能建立物件,只可以通過指標或引用指向派生類物件
c. 抽象類中,普通成員函式可以呼叫純虛函式;建構函式和析構函式不可呼叫
d. 乙個類派生與乙個抽象類,只有實現了所有基類中純虛函式才可變為非抽象類
虛函式及其實現
虛函式可以在執行的過程中動態編聯,根據指標所指的物件,呼叫對應的函式 成為虛函式必須滿足兩個條件 1.函式依賴於物件呼叫 因為虛函式是儲存在虛函式表中,有乙個虛函式指標指向虛函式表,要呼叫虛函式必須通過虛函式指標,虛函式指標是儲存在物件中的。2.函式必須可定址,因為虛函式表中存放的是虛函式的入口位址...
C 中的虛函式及其實現方式
首先看 不採用虛函式的情況 include stdafx.h include using namespace std class a void print class b public a int main 上述的兩次輸出均為 this is a 100 證明在不採用虛函式的基礎上,用父類的指標指向...
C 虛基類 虛函式與純虛函式
虛基類 在說明其作用前先看一段 classa class b publica classc publica classd public b publicc void main 從 中可以看出類b c都繼承了類a的ivalue成員,因此類b c都有乙個成員變數ivalue 而類d又繼承了b c,這樣類...