如果類有虛函式,則類會有預設的乙個指標成員指向虛函式表(可能儲存在全域性區)的位址,指標占用4個位元組。
虛函式:
// easytest.cpp: 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include
using namespace std;
class a
};class b : public a
};int main()
兩個都會輸出 this is a,不滿足多型要求。
用來做基類的類的析構函式一般都是虛函式。
例:a類,b類 (繼承了a)
a a=new b;
a.print(); 則會輸出a的print(); 正如 a::a.print(); 會根據指標型別,指標型別在編譯時已知。 編譯器對非虛方法使用靜態編譯。
若print()為virtual則輸出b的print(); 會根據物件型別,通常只有在執行時才能確定物件型別。編譯輯器對虛方法使用動態編譯。
純虛函式:
把虛函式賦值為0就是純虛函式。
純虛函式必須在子類中實現,否則子類也不可例項化。虛函式則不必在子類中實現。
多重繼承:
b繼承a,c繼承a,d繼承b、c。
需要用到虛基類:b virtual public a cvirtual public a
d:public b,public c 這樣就不會有二義性。
C 多重繼承 虛繼承
c 中的多繼承,建構函式處理並沒有問題,物件構造的時候按照繼承中宣告的順序呼叫多個父類的建構函式,析構函式同樣遵守單繼承中的原則。二意性問題 如果多基類中存在同名成員,會產生二意性的問題 比如,root1類中宣告doany 介面,root2類中也宣告了doany 介面,child多承繼root1和r...
C 之虛函式和多重繼承
原文出處 原文的作者是aaron ballman,voting member of the c standards committee.class a virtual void foo class b virtual void bar class c public a,public b void f...
C 多重繼承與虛繼承
在派生類中對基類成員的訪問應該是唯一的。但是,在多繼承情況下,可能造成對基類中某個成員的訪問出現了不一致的情況,這時就稱對基類成員的訪問產生了二義性。派生類在訪問基類成員函式時,由於基類存在同名的成員函式,導致無法確定訪問的是哪個基類的成員函式,因此出現了二義性錯誤。例如 includeusing ...