友元函数和派生类
Friend functions and derived classes
我试图从定义了朋友函数的基中派生一个类。我想为我的派生类创建一个友元函数,它使用基类的友元函数,但保留派生类的类型:
#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是给定一个基础返回,但被告知返回派生),这可能不是很好的c++形式。我的基类有大量的朋友函数类似于此,有没有一种方法来利用朋友函数与我的派生类,而不必修改它们?
谢谢
编辑:错误,供参考,是:
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);
最明显的方法是将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
的朋友。
如果不知道你真正想做什么,就很难给出进一步的建议。你需要这样做的事实是"代码气味"的一个例子——一个积极的信号,表明你的设计是有缺陷的,随着你的代码不断增长,你将继续需要做这样的变通。这逐渐使更改代码变得越来越困难-每次更改一部分,都必须围绕其他部分进行工作。
相关文章:
- 在派生函数中指定void*参数
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- 从基类数组调用派生函数
- 我设计了一个类并创建了基指针,但是当我尝试通过基指针访问派生函数时,它会出错
- c++ 在派生函数中启动 OMP 线程
- 派生函数的映射
- NIST SP 800-56A 串联/单步密钥派生函数的现有实现
- C++从基类实例调用派生函数
- c++多态性-使用基指针访问派生函数
- 派生函数中的NULL实现
- 与派生函数参数绑定
- 从基类派生函数
- 继承和使用派生函数
- 在列表对象中使用对象的派生函数
- 当派生函数定义了析构函数时,使用复制函数而不是移动函数
- 使用基类的派生函数
- 为什么调用基类函数而不是派生函数
- 多重继承派生类:如何在不重复调用 base 的情况下重用派生函数
- 试图与 Base 中的派生函数交朋友 - 为什么它不起作用?
- 在继续派生函数之前先执行基函数