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