您好,登錄后才能下訂單哦!
虛函數:
1)只有成員函數才能被聲明為虛函數,靜態成員函數不行,原因是靜態成員函數在編譯期就已經
確定和哪個類綁定了,而虛含數是動態綁定的,在運行時才知道和哪個類綁定
2)虛函數覆蓋的版本,必須和該函數在基類中的原始版本一樣,即函數名,形參名,常屬性一樣
3)如果基類中的虛函數返回類類型的指針(A*)或引用(A&),那么允許子類覆蓋版本返回B*或(B&)
4)基類中的虛函數不管是在什么訪控屬性(public,protected,private)下,都能被子類繼承(public),子
類類名無法調用(因為虛函數不是靜態的)
哪些函數可以聲明為虛函數?
成員函數 0k
靜態成員函數 no
全局函數 no
析構函數 ok
操作符重載函數 ok
注意:
1)多態特性除了要在基類中聲明虛函數,并在子類中提供有效的覆蓋外,還必須通過指針或引用來調用,才能表現出多態
2)調用虛函數的指針可以是this指針,只要它是一個指向子類對象的基類指針
3)當基類的構造函數被子類的構造函數調用時,子類對象尚未構造完成,不能說是子類類型的,它只能表現出基類類型的外觀和行為,這時調用虛函數,只能被綁定倒基類的版本,無多態特性
4)當基類的析構函數在被子類的系夠函數調用時,子類對象已經不再是子類類型,它只能表現出基類的外觀和行為,調用此析構函數,只能被綁定倒基類版本,沒有多態特性.
5)虛函數在基類中,可以實例化
2.純虛函數
virtual 返回類型 函數名(形參表)[const] =0;
3.抽象類
1)一個類中包含了至少一個純虛函數
2)抽象類不能實例化對象
3)如果子類沒有覆蓋其基類中的全部純虛函數,那么該子類就是一個抽象類
4)純虛函數不管是在什么訪控屬性下(public,protected,private),都能被子類繼承
6)純虛函數在基類中不能定義.
5)虛函數也為成員函數,而不是靜態成員函數,這里不再羅嗦了
4.動態綁定對性能的影響
1)動態綁定會增加內存開銷
2)虛函數的調用會增加時間的開銷
3)虛函數不能被內聯優化
//虛函數主要是用基類指針或引用來調用子類函數來形成多態 #include <iostream> class A{ public: //這里肯定時public,不然沒法通過基類指針調用字類函數 virtual void print(void){ std::cout << "A::print()" <<std::endl; } }; class B:public A{ private: void print(void){//注意重載和覆蓋的區別,這里為覆蓋, //即子類的基類函數一樣,只是函數體不一樣 std::cout << "B::print()" << std::endl; } }; int main(void){ B b; A& a = b; a.print(); //B中的print(),如果把class A中的virtual去掉,調用 //的就是A中的print()了 return 0; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。