1. 程式人生 > >4 虛函數用法

4 虛函數用法

而是 綁定 new ace 輸出 是否 聲明 virtual over

分析下列程序:

#include<iostream>
#include<string.h>
using namespace std;
class Base{
    public:
        Base() {
            echo();
        }
        virtual void echo() {
            printf("Base");
        }
};
class Derived : public Base {
    public:
        Derived() {
            echo();
        }    
        
virtual void echo() { printf("Derived"); } }; int main() { Base *base=new Derived(); base->echo(); return 0; }

程序輸出:  Base 、Derived、Derived

分析:

首先聲明Base類型的指針指向實際類型為Derived的對象,先調用基類構造函數,再調用派生類構造函數。輸出Base, Derived.

base->echo(); 指針是base類型,但是因為有關鍵詞 virtual,所以不是隱藏而是重寫.調用的是Derived的方法,輸出Derived。


1.重載:重載從overload翻譯過來,是指同一可訪問區內被聲明的幾個具有不同參數列(參數的類型,個數,順序不同)的同名函數,根據參數列表確定調用哪個函數,重載不關心函數返回類型。

2.隱藏:隱藏是指派生類的函數屏蔽了與其同名的基類函數。註意只要同名函數,不管參數列表是否相同,基類函數都會被隱藏。

3.重寫:重寫翻譯自override,也翻譯成覆蓋(更好一點),是指派生類中存在重新定義的函數。其函數名,參數列表,返回值類型,所有都必須同基類中被重寫的函數一致。只有函數體不同(花括號內),派生類調用時會調用派生類的重寫函數,不會調用被重寫函數。重寫的基類中被重寫的函數必須有virtual修飾。

註意:父類構造函數裏不能調用虛函數,因為虛函數是運行時調用確定的,父類對象會調用子類函數,這樣會出問題。

動態綁定只有在通過指針或引用調用虛函數時才會發生。

虛函數在構造函數裏面與普通函數一樣,失去了多態性,但是一般在構造函數裏面不調用虛函數。

4 虛函數用法