簡體   English   中英

使用第1層指針調用第3層子類

[英]Calling a 3rd layer subclass using a 1st layer pointer

我建立了一個類層次結構,其中第一層超級類是職員。 在第二層中,我有2個子類,分別稱為管理員和學術人員。 (這兩層也是抽象類)。 學術人員還有2個僅用於教學和研究的子類。

在我的主要工作中,我試圖創建一個由10個職員指針組成的數組(5個管理員和5個學術指針),並使用這些指針操縱第三層子類。 切記第三層子類的行為在第一層或第二層中不存在。 因此,我必須使用類型轉換。 我可以分別更改第三層的行為,例如,

((ResearchStaff *)ptr[i])->setResearchHour(23);

但很快就會變得非常混亂。 我的問題是,如何在for或while循環中訪問我的第3層行為,而不必單獨設置它們。 這是與我合作的主要工具。 非常感謝!!

int main()
{
  Staff *ptr[10];
  for(int i=0;i<10;i++)
  {
    ptr[i] = new AdminStaff;
    ((AdminStaff *)ptr[i])->setAdmin(12);

    i++;
    ptr[i] = new TeachingStaff;
    (( TeachingStaff*)ptr[i])->setTeaching(16);
  }
}

兩件事情!

  1. 當創建一個新的派生類對象(在本例中為AdminStaffTeachingStaff ,不必強制轉換回base即可調用派生類方法。

所以代替

    ptr[i] = new TeachingStaff;
    (( TeachingStaff*)ptr[i])->setTeaching(16);

你可以這樣寫

    TeachingStaff *ts = ptr[i] = new TeachingStaff;
    ts->setTeaching(16);
  1. 您只應調用基類引用/指針來調用所有類共有的方法。

最后,如果這些類沒有很多共同的屬性,則可以考慮將組成作為替代設計策略,而不是使用多重繼承。

您可以使用Visitor模式。

在您的Staff類中添加一個名為accept ,如下所示:

class Staff 
{
   //Other staff stuff
   public:
      void accept(const Visitor& v) = 0;
}

將實現添加到葉類中...

class ResearchTeacher
{
    //Other research teacher stuff...

    public:
       void accept(const Visitor& v) {
       v.visit(*this);
    }
}

然后定義一個訪問者,該訪問者知道如何處理每種類型:

class Visitor
{
   public:
      void visit(ResearchTeacher& teacher) 
      {
         teacher.setResearch(16);
      }

      void visit(TeachingTeacher& teacher)
      {
         teacher.setTeaching(16);
      }

      void visit(AdminStaff& admin) 
      {
         admin.setAdmin(12);
      }
}

現在,調用代碼不必擔心:

int main()
{
  Visitor v;
  Staff *ptr[10];
  for(int i=0;i<10;i++)
  {
    ptr[i] = new AdminStaff;
    ptr[i]->accept(v);

    i++;
    ptr[i] = new TeachingStaff;
    ptr[i]->accept(v);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM