【问题标题】:Calling a 3rd layer subclass using a 1st layer pointer使用第一层指针调用第三层子类
【发布时间】:2015-09-17 04:14:16
【问题描述】:

我创建了一个类层次结构,其中第一层超类是员工。在我的第二层,我有 2 个子类,称为管理人员和学术人员。 (这两层也是抽象类)。学术人员还有 2 个仅教学和仅研究的子类。

在我的主要工作中,我试图创建一个包含 10 个工作人员指针(5 个管理员和 5 个学术指针)的数组,并使用指针操作第 3 层子类。 请记住,第 3 层子类具有在第 1 层或第 2 层中不存在的行为。因此,我必须使用类型转换。 我可以单独更改我的第 3 层行为,例如,

((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);
  }
}

【问题讨论】:

    标签: c++ pointers abstract-class multiple-inheritance dynamic-arrays


    【解决方案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);
      }
    }
    

    【讨论】:

      【解决方案2】:

      两件事!

      1. 当您创建一个新的派生类对象时,在本例中为AdminStaffTeachingStaff,您不必将类型转换回基类来调用派生类方法。

      所以不是,

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

      你可以写一些类似的东西,

          TeachingStaff *ts = ptr[i] = new TeachingStaff;
          ts->setTeaching(16);
      
      1. 您应该只调用基类引用/指针来调用所有类共有的方法。

      最后,如果这些类没有很多共同的属性,您可以考虑将composition 作为替代设计策略,而不是使用多重继承。

      【讨论】:

        猜你喜欢
        • 2023-02-18
        • 1970-01-01
        • 2018-07-06
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多