C++ 虚拟函数不能是朋友

C++ 虚拟函数不能是朋友,c++,C++,我希望为具有以下功能的C类创建一个接口: friend bool operator==(const C& a, const C& b);* 我希望为C创建一个模拟,用于测试驱动目的 我试着这样做: class IC { virtual friend bool operator==(const IC& a, const IC& b) = 0; }; 我该怎么办?运算符==是一个二进制运算符。要使其虚拟,它必须是类成员 class IC { vir

我希望为具有以下功能的C类创建一个接口:

friend bool operator==(const C& a, const C& b);*
我希望为C创建一个模拟,用于测试驱动目的

我试着这样做:

class IC
{
    virtual friend bool operator==(const IC& a, const IC& b) = 0;
};

我该怎么办?

运算符==是一个二进制运算符。要使其
虚拟
,它必须是类成员

class IC
{
    virtual bool operator==(const IC& b) = 0;
};
在这种情况下,
==
的第一个参数是隐式的
this

您的声明是关于一个自由函数,而不是类成员

class IC
{
    virtual bool operator==(const IC& b) = 0;
};

编辑:正如注释中所建议的,您应该避免这种情况,而应该实现一个
比较
函数或类似函数。

运算符==
是一个二进制运算符。要使其
虚拟
,它必须是类成员

class IC
{
    virtual bool operator==(const IC& b) = 0;
};
在这种情况下,
==
的第一个参数是隐式的
this

您的声明是关于一个自由函数,而不是类成员

class IC
{
    virtual bool operator==(const IC& b) = 0;
};


编辑:正如评论中所建议的,您应该避免这种情况,而应该实现
比较
功能或类似功能。

虚拟功能可以是朋友,但免费功能不能是虚拟的。友元声明不声明成员函数(除非您显式指定了其他类的成员)。你想实现什么?谁说虚拟功能不能成为朋友(每个人都可以成为朋友!:@Mehrdad虚拟函数只存在于类的上下文中。您如何将其声明为朋友?我希望模拟C。因此,我正在测试的代码将采用mock C(具有IC基)而不是C(具有相同的IC基)。然后,我可以监视运算符==、函数调用次数的输入参数,以及控制返回值。@LuchianGrigore:有人把我的评论看得太严重了!;)(这个问题越来越小了……“虚拟函数不能是朋友”,“我想模仿C”等等……哈哈。)虚拟函数可以是朋友,但免费函数不能是虚拟的。友元声明不声明成员函数(除非您显式指定了其他类的成员)。你想实现什么?谁说虚拟功能不能成为朋友(每个人都可以成为朋友!:@Mehrdad虚拟函数只存在于类的上下文中。您如何将其声明为朋友?我希望模拟C。因此,我正在测试的代码将采用mock C(具有IC基)而不是C(具有相同的IC基)。然后,我可以监视运算符==、函数调用次数的输入参数,以及控制返回值。@LuchianGrigore:有人把我的评论看得太严重了!;)(这个问题越来越渺小了……“虚拟函数不能成为朋友”,“我想模拟C”等等……哈哈。)运算符==不能很好地处理多态性,它提出了各种各样的问题,关于如何通过引用抽象来比较对象的具体状态class@Gart不是说这很容易:)这不仅不容易,这几乎总是不是个好主意。如果需要模拟/抽象“比较”功能,那么它可能应该位于命名函数中。改变传统的
操作符==
的自由函数实现是一种折衷,IMHO。你所说的比较函数是什么意思?运算符==用于测试迭代器是否已到达末尾。@Baz为什么迭代器需要虚拟函数?你打算从迭代器派生吗?运算符==不能很好地处理多态性,它提出了各种各样的问题,关于如何通过对抽象的引用来比较对象的具体状态class@Gart不说它容易:)它不仅不容易,而且几乎总是不是一个好主意。如果需要模拟/抽象“比较”功能,那么它可能应该位于命名函数中。改变传统的
操作符==
的自由函数实现是一种折衷,IMHO。你所说的比较函数是什么意思?运算符==用于测试迭代器是否已到达末尾。@Baz为什么迭代器需要虚拟函数?您是否计划从迭代器派生?