【问题标题】:C++ function that allows arbitrary class input允许任意类输入的 C++ 函数
【发布时间】:2014-04-14 05:45:02
【问题描述】:

现在我有一个类 A,它有一个方法 f:

class A{
public:
    double f(double x){return 0.0;};
};

我还有另一个 B 类和另一个方法 f:

class B{
public:
    double f(double x){return 0.0;};
};

我希望我的函数 myfun 在不必重载函数的情况下接受 A 类或 B 类:

double myfun(A a){
    return a.f(1.0);
}
double myfun(B b){
    return b.f(1.0);
}

我不想重载函数,因为我将使用 f() 方法拥有三个或更多不同的类。有没有办法做到这一点?

【问题讨论】:

  • 继承是您可以采用的另一种方式。

标签: c++ class templates overloading


【解决方案1】:

模板方法确实是前面提到的方法。 如果您对模板不满意,您可以通过继承获得相同的效果。

使用具有 myFun 虚拟(或纯虚拟)的基类,然后从该类派生每个后续类。

class Base {
public:
virtual double f(double x)=0;
}

class A : Base {
public :
double f (double x){return 0.0};
}

class B : Base {
public :
double f (double x}{return 1.0};
}

double myFun(Base b) {
   return b.f(1.0);
}

这是另一种选择。

【讨论】:

  • 应该是double myFun(Base& b)double myFun(Base* b)
  • 感谢更新的 Paranaix :)。说实话,如果“Base”类不是抽象的,就不需要这种改变。此外,任何想要继承遗产的人都需要公开。
  • 不,你错了。 1)您的代码将创建一个副本。 2)您将体验的称为切片,您不希望这种情况发生。请记住:永远不要按值传递虚拟对象!
  • 哦,这太棒了。我从不知道虚函数能做什么,但这令人大开眼界。
【解决方案2】:

一种选择是使用function templates

template <typename T>
double myfun(T t){
    return t.f(1.0);
}

int main()
{
  A a1 ;
  B b1 ;

  myfun( a1 ) ;
  myfun( b1 ) ;
}

See it live.

【讨论】:

    【解决方案3】:

    使用简单的模板函数:

    template<typename T>
    double myfun(T t) {
        return t.f(1.0);
    }
    

    然后你这样称呼它:

    A a;
    myfun(a);
    
    B b;
    myfun(b);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-04
      • 2011-04-04
      • 2015-08-14
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      相关资源
      最近更新 更多