朋友函数和派生类

时间:2015-10-01 22:53:57

标签: c++ inheritance friend-function

我试图从定义了友元函数的Base派生一个类。我想为我的派生类创建一个友元函数,该函数使用Base的朋友函数,但保留了Derived类的类型:

#include<algorithm>

class Base
{
public:
  Base(int i, int j, int k)
    {
      vect[0] = i;
      vect[1] = j;
      vect[2] = k;
    }
  ~Base();

  friend Base myMin (const Base& argA,
                     const Base& argB);
protected:
  // Member data
  int vect[3];
};

class Derived : public Base
{
public:
  Derived(int i, int j, int k)
    :
    Base(i,j,k)
    {
    }

  ~Derived();

  friend Derived doSomething(const Derived& argA,
                             const Derived& argB);
};

Base
myMin (const Base& argA,
       const Base& argB)
{
  int i = std::min(argA.vect[0], argB.vect[0]);
  int j = std::min(argA.vect[1], argB.vect[1]);
  int k = std::min(argA.vect[2], argB.vect[2]);
  return Base(i,j,k);
}

Derived doSomething(const Derived& argA,
                    const Derived& argB)
{
  // Does other stuff too...
  return myMin(argA, argB);
}

int main(int argc, char *argv[])
{
  Derived testA(2,4,6);
  Derived testB(3,3,7);

  doSomething(testA,testB);

  return 0;
}

我理解为什么这不起作用(doSomething有一个Base返回,但被告知返回Derived),而且这可能不是很好的C ++形式。我的Base类有很多类似于此的朋友函数,有没有办法在我的Derived类中使用友元函数而不必修改它们?

谢谢

已编辑:错误供参考:

base.H: In function ‘Derived doSomething(const Derived&, const Derived&)’:
base.H:50:26: error: could not convert ‘myMin(const Base&, const Base&)((* &(& argB)->Derived::<anonymous>))’ from ‘Base’ to ‘Derived’
   return myMin(argA, argB);

1 个答案:

答案 0 :(得分:0)

最明显的方法是将doSomething()更改为

 Derived doSomething(const Derived& argA,
                     const Derived& argB)
 {
      Base temp(myMin(argA, argB));
      Derived retval(temp.vect[0], temp.vect[1], temp.vect[2]);
      return retval;
 }

您可能还必须声明doSomething()也是Base的朋友。

在不了解您真正想要做的事情的情况下,很难进一步提出建议。你需要这样做的事实就是一个“代码味道”的例子 - 一个表明你的设计有缺陷的正面迹象,随着你的代码不断增长,你将需要做这样的解决方法。这逐渐使得更改代码变得越来越难 - 每次更换一个部件时,都必须解决其他问题。