簡體   English   中英

在派生類中重新定義基類的Friend函數

[英]Redefining Friend Function of Base Class in Derived Class

我想在派生類BigNum重新定義operator*函數,該函數最初在Vector類中定義為朋友。 具體來說,我想調用Vector版本的operator* ,然后在BigNum的operator *中對該操作的結果做一些其他事情。 這是該結構的一小段(再次感謝@lemmes來幫助實現這一點):

template<typename T>
class Vector
{
private:
  std::vector<T> base;

public:                                                                                                                 
  Vector();                                                                                                                        
  Vector(const std::vector<T> vec);                                                                                                
  Vector(const Vector& vec);

  template<typename T1, typename T2>
  friend auto operator*(const Vector<T1>& lhs, const Vector<T2>& rhs) -> Vector<decltype(std::declval<T1>() * std::declval<T2>())>;
};

template<typename T1, typename T2>
auto operator*(const Vector<T1>& lhs, const Vector<T2>& rhs) -> Vector<decltype(std::declval<T1>() * std::declval<T2>())>
{
  typedef decltype(std::declval<T1>() * std::declval<T2>()) T3;
  assert(lhs.base.size() == rhs.base.size());
  Vector<T3> result;
  result.base.reserve(lhs.base.size());
  std::transform(lhs.base.begin(), lhs.base.end(), rhs.base.begin(), std::back_inserter(result.base),
                 [](const T1& e1, const T2& e2) { return e1 * e2; });
  return result;
}

class BigNum : public Vector<int>
{
 public:
  BigNum();
  BigNum(const std::vector<int> init);
  ~BigNum();

  BigNum operator*(const BigNum& rhs);
};
#endif

BigNum BigNum::operator*(const BigNum& rhs)
{

  // How can I call Vector's operator* (a friend of the Vector class)                                                                            
  // and then do other stuff in here?                                                                                                            
}

#include "BigNum.h"

int main()
{

  int arr1[] = {1,2,3,4,5};
  int arr2[] = {10,20,30,40,50};
  std::vector<int> vec1 (arr1, arr1 + sizeof(arr1) / sizeof(arr1[0]));
  std::vector<int> vec2 (arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]));

  BigNum bn1(vec1), bn2(vec2);

  bn1 * bn2;  // want to call BigNum's operator* here

  return 0;
}

我顯然不能做類似Vector::operator*事情,因為它是一個朋友。 提前致謝!

您可以編寫static_cast<Vector<int>&>(bn1) * static_cast<Vector<int>&>(bn2)來調用矢量的重載運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM