#include
using namespace std;
// 過載就是一種多型
// 又稱同名隱藏:子類隱藏父類所有的同名函式(這也算是過載只是為了區分第一種)。
//是指虛表(virtual fun ptr = vfptr)內的覆蓋,因在基類中增加虛表,如果基類本身是4位元組會變成8位元組,增加4個位元組的虛表指標
class q
virtual ~q(){}
void fun()
void fun(int a)
virtual void show()
virtual void print()
private: int x;
};class p:public q
~p(){}
void fun()
void show()
virtual void getp()
private: int y;
};//虛表是由 虛函式的位址+虛函式名組成(先父類再子類),虛表結束是以 0x00000000 為結束符,多個虛表多個結束符。
//單一繼承 無覆蓋 :先按宣告順序排列父類虛函式,再其後按宣告順序排列子類虛函式
//單一繼承 有覆蓋 :先按宣告順序排列父類虛函式,再其後按宣告順序排列子類虛函式,
//然後移除子類需覆蓋的虛函式所在虛表的資訊去覆蓋父類同名虛函式(子類替換了父類虛函式所在虛表的位址和函式名)
//多繼承 無覆蓋:當有n個父類繼承時就會有n個虛表。先按父類在子類宣告的順序排列虛表,
//然後在各自虛表內按宣告順序排列父類虛函式,子類虛函式最後排列在第乙個父類虛表後面。
//多繼承 有覆蓋:當有n個父類繼承時就會有n個虛表。先按父類在子類宣告的順序排列虛表,
//然後在各自虛表內按宣告順序排列父類虛函式,再第乙個父類虛表後按宣告順序排列子類無覆蓋虛函式,
//然後移除子類需覆蓋的虛函式去覆蓋所有父類同名虛函式(子類需覆蓋的虛函式替換了所有父類虛函式所在虛表的位址和函式名)
class base
virtual void b()
virtual void c()
private:int x;
};class base1
virtual void b()
virtual void c()
private:int y;
};class base2
virtual void b()
virtual void c()
private:int z;
};class d :public base
void b()//本身就是虛函式
virtual void c1()
private:int m;
};class d1 :public base, public base1, public base2
void b()//本身就是虛函式
virtual void c1()
private:int n;
};int main()
虛繼承 過載 覆蓋 隱藏
關於c 中的虛擬繼承的一些總結 1.為什麼要引入虛擬繼承 虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現的。如 類d繼承自類b1 b2,而類b1 b2都繼承自類a,因此在類d中兩次出現類a中的變數和函式。為了節省記憶體空間,可以將b1 b2對a的繼承定義為虛擬繼承,而a就成了虛擬基類...
過載 重寫(覆蓋) 隱藏(重定義)
1 過載要求 函式名相同,引數不同 個數 型別 常函式也可以作為過載判斷。注意返回值不是過載的判斷標準。2 重寫 即覆蓋 要求 要求基類函式為虛函式,且基類函式和派生類函式名 引數等相同。3 隱藏 即重定義 要求 子類重新定義父類中有相同名稱的非虛函式 引數列表可以不同 4 重寫和隱藏都是發生在基類...
C 基礎(五)虛函式 過載 覆蓋 隱藏
虛函式總是跟多型聯絡在一起,引入虛函式可以使用基類指針對繼承類物件進行操作!虛函式 繼承介面 函式名,引數,返回值 但是實現不繼承 函式體 非虛函式 繼承介面,也繼承實現 1 虛析構函式 當乙個類打算作為基類使用時候,其析構函式必須是虛函式 建構函式可以為虛函式嗎?不可以,在生成物件的時候,必須向編...