子類(lèi)函數(shù)對(duì)父類(lèi)同名函數(shù)的覆蓋

字號(hào):

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