C ++在多态子类中添加虚方法

时间:2014-10-21 17:02:21

标签: c++ oop inheritance polymorphism

我有一些繁琐的类,我想重构它以用子类替换类型代码。在这个过程中的某个时刻,我有以下层次结构:

// interface
ISomeClass(){
public:
    virtual foo() = 0;
    virtual ~ISomeClass();
}


// this class is cumbersome one with huge amount of conditional logic based on type
BaseSomeClass : public ISomeClass(){
public:
    virtual foo(){
       if(TYPE_0 == getType()){   // finally I want to move such conditional logic in subclass
           doSmth();
       } else if (TYPE_1 == getType()){
           doAnother();
       }
    }


protected:
    virtual int getType(){     // I temporary need it for refactoring issue 
        return type_;          // to replace type_ with subclasses
    }

private:
    int type_;

};

// this classes is almost empty now, but I want to move there all conditional logic in future
class Implementation1 : public BaseSomeClass {
     virtual int getType(){    // I temporary need it for refactoring issue 
        return TYPE_0;         // to replace type_ with subclasses
    }
}; 


class Implementation2 : public BaseSomeClass {
     virtual int getType(){    // I temporary need it for refactoring issue 
        return TYPE_1;         // to replace type_ with subclasses
    }
};

BaseSomeClass中定义了额外的虚拟方法getType()。如果我使用某种接口ISomeClass指针处理所有实例,这种方法行为会是多态的吗?假设界面本身并不提供这种虚拟方法。 注意此代码是重构的第一步,而不是最后一步。这也是一个简化的例子,真正的代码有几十个这样的方法,我需要一步一步地进行重构。问题是关于C ++动态多态性。

1 个答案:

答案 0 :(得分:4)

你问:

  

如果我使用某种接口ISomeClass指针处理所有实例,这种方法行为会是多态的吗?假设接口本身不提供这样的虚拟方法。

如果界面没有提供这样的虚拟方法,则不能指望多态行为。

最好在fooImplementation1中实施Implementation2

class BaseSomeClass : public ISomeClass()
{
};

class Implementation1 : public BaseSomeClass 
{
   virtual void foo()
   {
      doSmth();
   }
}; 


class Implementation2 : public BaseSomeClass
{
   virtual void foo()
   {
      doAnother();
   }
};

如果必须使用getType(),则可以采用基于模板的多态行为。

template <typename D>
class BaseSomeClass : public ISomeClass()
{
   public:
      virtual foo()
      {
         int type = D::getType();
         if(TYPE_0 == type)
         {
            doSmth();
         }
         else if (TYPE_1 == type)
         {
            doAnother();
         }
      }
};

此处,您希望D提供界面getType()。您可能希望D提供接口foo

template <typename D>
class BaseSomeClass : public ISomeClass()
{
   public:
      virtual void foo()
      {
         D::foo():
      }
};