基类和派生类的友元函数

Posted

技术标签:

【中文标题】基类和派生类的友元函数【英文标题】:friend function of base class and derived class 【发布时间】:2012-04-19 12:13:43 【问题描述】:

我有一个基类 Fraction 和一个派生类 iFraction。 Fraction 代表假分数,iFraction 代表混合分数。

class Fraction ...;
class iFraction : public Fraction ...;

现在,我要声明这两个类的友元函数,即convertF。函数 convertF 可以将假分数(Fraction)转换为混合分数(iFraction)。 我这样做有多冷? 实际上,我想这样声明函数:

friend iFraction convertF (Fraction &Fra);

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的回答。但是,我现在不知道什么是dynamic_cast。我只是一个新手。【参考方案2】:

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

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

更新:这就是为什么你不能像上面显示的那样声明你的朋友函数的原因。为此,编译器需要知道iFraction 的完整定义,同时还没有完成基类Fraction 的定义,这是不可能的。

从技术上讲,它可以通过转发声明iFraction 来反过来工作。尽管我仍然认为它不是一个好的解决方案。你确定你的类层次结构是正确的吗?

【讨论】:

感谢您的回答。现在,我明白为什么我不能这样做了。但是,我如何才能实现将 Fraction 转换为 iFraction 的目的 Fraction 类有两个数据成员,一个用于分子,一个用于分母。 iFraction 类多了一个数据成员 iNum,代表整数的一部分 @user1305904,在仔细检查了条款之后,现在我确定您的继承关系不正确:带分数不是假分数。当然,两者之间的转换是完全明智的。 你可能是对的。这段代码只是为了练习我的编程技巧。无论如何感谢您的意见。【参考方案3】:

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

始终尝试首先理解这个概念。

【讨论】:

以上是关于基类和派生类的友元函数的主要内容,如果未能解决你的问题,请参考以下文章

将派生类的构造函数声明为父类的友元

4月14日继承与多态

类与类之间的友元关系可以继承吗? 友元函数是类的成员函数吗?

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承