我有一个基类Fraction和一个派生类iFraction。分数代表不适当的分数,iFraction代表混合分数。
class Fraction {...};
class iFraction : public Fraction {...};
现在,我想声明这两个类的友元函数,即convertF。函数convertF可以将不正确的分数(分数)转换为混合分数(iFraction)。 我这么冷啊? 实际上,我想声明这样的函数:
friend iFraction convertF (Fraction &Fra);
但是,它不能在基础calss Fraction中声明。为什么呢?
答案 0 :(得分:2)
由于friend
关系未被继承,因此您需要将convertF
声明为两个类的朋友。但是只有当函数需要访问这些类的内部时才需要这个 - 你确定类的公共接口是不够的吗?
试图避免这种双重朋友的另一个原因是它会通过convertF
的签名在这些类之间创建循环依赖。
更新:这正是您无法按照上面显示的方式声明朋友功能的原因。为了实现这一点,编译器需要知道iFraction
的完整定义,而它仍未完成基类Fraction
的定义,这是不可能的。
从技术上讲,它可以通过前方声明iFraction
来反过来。虽然我仍然不认为这是一个很好的解决方案。你确定你的班级层次结构是对的吗?
答案 1 :(得分:2)
您不需要朋友功能。有两种方法可以使用dynamic_cast或编写转换构造函数,该构造函数接受Fraction对象并将其转换为iFraction对象。我不太确定第二种选择是不是一个好的选择,但是尝试一下。
答案 2 :(得分:0)
阅读本文:http://www.cprogramming.com/tutorial/friends.html
首先尝试理解这个概念。