關於 Virtual function 的成員存取控制
前言
最近使用 Qt 的時候發現到 Virtual function 在繼承後可以與基底類別的存取區域不一樣,這才發現到我對 Virtual function 的觀念有問題,在此把學習的過程做個紀錄。內容
我原本認為的 Virtaul function 如下class CA { public: CA(){} virtual void Call(){ printf("CA::Call()\n"); } }; // class CB:public CA { public: CB(){} virtual void Call(){ printf("CB::Call()\n"); } }; // CB b; b.Call();//CB::Call()
範例中的 CB::Call() 與 CA::Call() 的存取區域都必需是"public",但這個觀念其是錯的! CB::Call() 的存取區域可以自己定義所屬的存取區域,如下範例
class CA { public: CA(){} virtual void Call(){ printf("CA::Call()\n"); } }; // class CB:public CA { public: CB(){} private: virtual void Call(){ printf("CB::Call()\n"); } }; // CB b; b.Call();//Compile error! CA* pA = (CA*)&b; pA->Call();//CA::Call();
在範例中這次把 CB::Call() 改成"private",所以"b.Call()"會變成 Compile error ,但由於 CA::Call() 依舊是"public",所以透過轉型還是可以喚起 CA::Call() 。