C++ 基类和派生类的友元函数
我有一个基类分数和一个派生类分数。分数代表不合适的分数,而iFraction代表混合分数C++ 基类和派生类的友元函数,c++,class,friend,C++,Class,Friend,我有一个基类分数和一个派生类分数。分数代表不合适的分数,而iFraction代表混合分数 class Fraction {...}; class iFraction : public Fraction {...}; 现在,我想声明这两个类的一个友元函数,即convertF。函数convertF可以将不合适的分数(分数)转换为混合分数(iFraction)。 我这么做有多冷? 实际上,我想这样声明函数: friend iFraction convertF (Fraction &Fra);
class Fraction {...};
class iFraction : public Fraction {...};
现在,我想声明这两个类的一个友元函数,即convertF。函数convertF可以将不合适的分数(分数)转换为混合分数(iFraction)。
我这么做有多冷?
实际上,我想这样声明函数:
friend iFraction convertF (Fraction &Fra);
但是,它不能在基本calss分数内声明。为什么?因为
朋友关系不是继承的,所以需要将convertF
声明为这两个类的朋友。但是,只有当函数需要访问这些类的内部时,您才需要它——您确定这些类的公共接口不够用吗
试图避免这种双重朋友的另一个原因是,它将通过convertF
的签名在这些类之间创建循环依赖关系
更新:这正是您不能按照上面显示的方式声明好友函数的原因。要使其工作,编译器需要知道iFraction
的完整定义,而基类Fraction
的定义尚未完成,这是不可能的
从技术上讲,它可以反过来工作,通过向前声明iFraction
。虽然我还是不认为这是一个好的解决方案。你确定你的类层次结构是正确的吗?因为朋友关系不被继承,你需要将convertF
声明为两个类的朋友。但是,只有当函数需要访问这些类的内部时,您才需要它——您确定这些类的公共接口不够用吗
试图避免这种双重朋友的另一个原因是,它将通过convertF
的签名在这些类之间创建循环依赖关系
更新:这正是您不能按照上面显示的方式声明好友函数的原因。要使其工作,编译器需要知道iFraction
的完整定义,而基类Fraction
的定义尚未完成,这是不可能的
从技术上讲,它可以反过来工作,通过向前声明iFraction
。虽然我还是不认为这是一个好的解决方案。你确定你的类层次结构是正确的吗?你不需要一个friend函数。有两种方法可以做到这一点:使用dynamic_cast或编写转换构造函数,该构造函数接受一个分数对象并将其转换为iFraction对象。我不太确定第二个选项是否是一个好的选项,但是我们可以尝试一下。您不需要一个friend函数。有两种方法可以做到这一点:使用dynamic_cast或编写转换构造函数,该构造函数接受一个分数对象并将其转换为iFraction对象。我不太确定第二个选项是否是一个好的选项,但值得一试。阅读以下内容:
始终首先尝试理解概念 读一下:
始终首先尝试理解概念 谢谢你的回答。现在,我明白为什么我不能这么做了。但是,我怎样才能实现将分数转换为Ifraction的目的?类分数有两个数据成员,一个是分子,一个是分母。iFraction类还有一个数据memeber iNum,它表示integer@user1305904,在仔细检查这些术语之后,现在我确信您的继承关系是错误的:混合分数不是不正确的分数。当然,两者之间的转换是完全合理的。你可能是对的。这段代码只是为了练习我的编程技巧。无论如何,谢谢你的意见。谢谢你的回答。现在,我明白为什么我不能这么做了。但是,我怎样才能实现将分数转换为Ifraction的目的?类分数有两个数据成员,一个是分子,一个是分母。iFraction类还有一个数据memeber iNum,它表示integer@user1305904,在仔细检查这些术语之后,现在我确信您的继承关系是错误的:混合分数不是不正确的分数。当然,两者之间的转换是完全合理的。你可能是对的。这段代码只是为了练习我的编程技巧。无论如何,谢谢你的意见。谢谢你的回答。然而,我不知道现在的动态演员是什么。我只是个新手,谢谢你的回答。然而,我不知道现在的动态演员是什么。我只是个新手。