1

如果從指針轉換至基礎構件的指針的派生類成員有效,爲什麼以下代碼編譯失敗爲什麼衍生指針從基座構件轉換給出錯誤

class Base 
{ 
public: 
    virtual void fun1() 
    { 
     cout<<"fun1 in Base"<<endl; 
    } 
}; 

class Der 
{ 
public: 
    void fun1() 
    { 
     cout<<"fun1 in Der"<<endl; 
    } 
}; 

int main() 
{ 
    void (Der::*funptr)() = &Base::fun1; 
} 

編譯器提供了一個錯誤說

error: cannot convert 'void (Base::)()' to 'void (Der::)()' in initialization|

+0

因爲它們是不同的類型?多態性適用於對象本身,而不是成員函數。 – goji

+1

@Troy:指向成員的指針遵守* contravariance *的規律。 OP說關於轉換的有效性是真的。雖然代碼編寫時沒有引起足夠的重視。 – AnT

回答

0

因爲你Der不是從Base的。你的課無關。它們之間沒有繼承關係。

如果你確實定義DerBase

class Der : public Base 
{ 
    ... 

後代的代碼進行編譯。

編譯器不能奇蹟般地猜測你想從Base推導出你的Der。你應該記得明確告訴編譯器。

+0

糟糕。我錯了。對不起,謝謝 – sajas

相關問題