2020年4月27日 星期一

關於 Virtual function 的成員存取控制

關於 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() 。

沒有留言:

張貼留言