基类和派生类的友元函数

时间:2012-04-19 12:13:44

标签: c++ class friend

我有一个基类Fraction和一个派生类iFraction。分数代表不适当的分数,iFraction代表混合分数。

class Fraction {...};
class iFraction : public Fraction {...};

现在,我想声明这两个类的友元函数,即convertF。函数convertF可以将不正确的分数(分数)转换为混合分数(iFraction)。 我这么冷啊? 实际上,我想声明这样的函数:

friend iFraction convertF (Fraction &Fra);

但是,它不能在基础calss Fraction中声明。为什么呢?

3 个答案:

答案 0 :(得分:2)

由于friend关系未被继承,因此您需要将convertF声明为两个类的朋友。但是只有当函数需要访问这些类的内部时才需要这个 - 你确定类的公共接口是不够的吗?

试图避免这种双重朋友的另一个原因是它会通过convertF的签名在这些类之间创建循环依赖。

更新:这正是您无法按照上面显示的方式声明朋友功能的原因。为了实现这一点,编译器需要知道iFraction的完整定义,而它仍未完成基类Fraction的定义,这是不可能的。

从技术上讲,它可以通过前方声明iFraction来反过来。虽然我仍然不认为这是一个很好的解决方案。你确定你的班级层次结构是对的吗?

答案 1 :(得分:2)

您不需要朋友功能。有两种方法可以使用dynamic_cast或编写转换构造函数,该构造函数接受Fraction对象并将其转换为iFraction对象。我不太确定第二种选择是不是一个好的选择,但是尝试一下。

答案 2 :(得分:0)

阅读本文:http://www.cprogramming.com/tutorial/friends.html

首先尝试理解这个概念。