【问题标题】:C++ function overloading, calling "overloaded" functionC++函数重载,调用“重载”函数
【发布时间】:2014-06-18 04:03:00
【问题描述】:

我有一些看起来像这样的代码:

// original function
size_t computeAverageRating(Movie m) { // take a movie object
    // compute average rating
}

// override original function
size_t computeAverageRating(size_t movieIndex) { // take the index of a movie
    getMovieObject(movieIndex);

    // call original function from here?
}

是否可以在不创建两个具有不同名称的单独方法的情况下执行 cmets 中描述的操作?

【问题讨论】:

  • 是的。这就是重载函数的用途。

标签: c++


【解决方案1】:

假设getMovieObject() 实际上返回一个Movie(虽然我会更改computeAverageRating() 以采用Movie &m 以避免复制对象):

size_t computeAverageRating(size_t movieIndex) { // take the index of a movie
  Movie m = getMovieObject(movieIndex);

  return computeAverageRating( m ) ;
}

应该这样做。

【讨论】:

  • 你的意思是const Movie &m
【解决方案2】:

应该有效,它是一个很好的方法,那你为什么要寻找另一种方法?

size_t computeAverageRating(size_t movieIndex) {
    return computeAverageRating(getMovieObject(movieIndex));
}

【讨论】:

    【解决方案3】:

    你所拥有的一切都很好。编译器会根据参数选择最好的函数,例如:

    size_t z;
    Movie x;
    size_t a = computeAverageRating(x);
    size_t b = computeAverageRating(z);
    

    将从第一个函数中获得 a 的平均评分,然后是 b 的第二个函数。

    【讨论】:

      【解决方案4】:

      据我所知,如果函数是在父类中定义的,那么你不能在不覆盖父类函数的情况下在子类中使用相同的函数名和不同的参数。

      如果要使用,则必须重写父类中定义的方法,或者需要将新函数定义的声明放在父类中。

      例如:

      class A
      {
      public:
          size_t computeAverageRating(Movie m) { // take a movie object
          // compute average rating
          }
      };
      
      class B:public A
      {
          public:
          size_t computeAverageRating(Movie m)   //this is required
          {
              A::computeAverageRating(m);
          }
          size_t computeAverageRating(size_t movieIndex)
          {
                 getMovieObject(movieIndex);
                 //put your logic here
          }
      };
      

      class A
      {
      public:
          size_t computeAverageRating(Movie m) { // take a movie object
          // compute average rating
          }
          virtual size_t computeAverageRating(size_t movieIndex){};
      };
      
      class B:public A
      {
          public:
          size_t computeAverageRating(size_t movieIndex)
          {
                 getMovieObject(movieIndex);
                 //put your logic here
          }
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 2012-09-02
        • 2014-05-30
        相关资源
        最近更新 更多