【问题标题】:C++ virtual method with class specific parameter具有类特定参数的 C++ 虚拟方法
【发布时间】:2017-02-04 19:10:34
【问题描述】:

您好,我有这样的想法,但我不知道如何实现它。在我的程序中,我已经有了基类,还有一些派生类。

base.hpp
BaseClass {
 public:
   BaseClass();
   virtual int getSomething(int param);
}

base.cpp
BaseClass::BaseClass(){};
int BaseClass::getSomething(int param)
{
  return param * 5;
}

derived1.hpp
DerivedClass1 : public BaseClass {
 public: 
  DerivedClass1();
}

derived2.hpp
DerivedClass2 : public BaseClass {
 public: 
  DerivedClass1();
}

现在我根据需要使用派生类或基类。

BaseClass *c = (BaseClass *) new DerivedClass1;
cout << c->getSomething(5);

我想要的是在基类中有某种类型的类特定参数,这对于 DerivedClass1 和 DerivedClass2 会有所不同。这是一个示例,它的外观。

base.hpp
BaseClass {
 public:
  BaseClass();
  virtual int getSomething(int param);
}

base.cpp
BaseClass::BaseClass(){};
int BaseClass::getSomething(int param)
{
  return param * CLASS_SPECIFIC_PARAM;
}

然后对于 DerivedClass1,这个 CLASS_SPECIFIC_PARAM 将是 5,对于 DerivedClass2 将是 6 或其他。 这甚至可能吗?最好的方法是什么?

【问题讨论】:

    标签: c++ object methods virtual


    【解决方案1】:

    您只需向基类添加一个参数,子类将根据自己的值重置:

    base.hpp

    BaseClass {
     public:
       BaseClass() : m_param(0) {};
       virtual int getSomething(int param);
     protected:
       int m_param;
    }
    

    derived1.hpp

    DerivedClass1 : public BaseClass {
     public: 
      DerivedClass1() : m_param(5) {};
    }
    

    derived2.hpp

    DerivedClass2 : public BaseClass {
     public: 
      DerivedClass1() : m_param(6) {};
    }
    

    PS:并为您的BaseClass添加一个虚拟析构函数

    【讨论】:

    • 是的,就是这样。谢谢
    【解决方案2】:

    另一种选择是虚拟(或纯虚拟函数)而不是受保护的成员。

    BaseClass {
     public:
       BaseClass();
       virtual int getSomething(int param);
     protected:
       virtual int getClassSpecific() const =0;
    }
    //...
    BaseClass::BaseClass(){};
    int BaseClass::getSomething(int param)
    {
      return param * getClassSpecific();
    }
    
    //...
    DerivedClass1 : public BaseClass {
     //...
     virtual int getClassSpecific() const { return 5;}
    }
    
    //.....
    DerivedClass2 : public BaseClass {
     //...
     virtual int getClassSpecific() const { return 6;}
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 2012-09-21
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多