子類函數(shù)對父類同名函數(shù)的覆蓋

字號:

先看一道題:
    class B
    {
    public:
    void f(int) const
    {
    cout << "B.int" << endl;
    }
    void f(double) const
    {
    cout << "B.double" << endl;
    }
    };
    class D: public B
    {
    public:
    void f(void*) const
    {
    cout << "D.void" << endl;
    }
    };
    int main()
    {
    D d;
    d.f(0); //調(diào)用那個函數(shù)?
    d.f(1); //調(diào)用那個函數(shù)?
    d.f(0.1); //調(diào)用那個函數(shù)?
    }
    答案:3個調(diào)用全部調(diào)用子類的f(void*)。但由于后兩個不能轉(zhuǎn)換為void*,編譯出錯。void*是可以指向任何類型的指針。C++中,只有int 0可以轉(zhuǎn)換為指針型,其余均不可以,所以出錯。
    關(guān)于子類函數(shù)對父類函數(shù)的覆蓋:
    (引用http://hi.csdn.net/doon的發(fā)言)
    在C++類里面,存在兩個概念,一個是重載,一個是覆蓋。
    重載只是在類的內(nèi)部存在,不會傳導(dǎo)到父類和子類中間。即便是一個函數(shù)聲明為virtual,也是這樣。
    如果一個類,存在和父類相同的函數(shù),那么,這個類將會覆蓋其父類的方法,除非你在調(diào)用的時候,強制轉(zhuǎn)換為父類類型,否則試圖對子類和父類做類似重載的調(diào)用是不能成功的。