尝试与 Base 中的 Derived 函数成为朋友 - 为什么它不起作用?

Trying to befriend a function of Derived in Base - Why doesn't it work?

我的第一个 post 在这里。我有两个 classes - Base 和 Derived(从 Base 公开派生)。在 Derived 中,我有一个函数 printAsFriend。编译器对此不满意。为什么?其他 classes 中的方法可以成为朋友。为什么它不适用于派生的 class?如果我删除继承,它就可以正常工作。

这有效 -

#include <iostream>
using namespace std;
class MyClass;
class YourClass{
    public:
    YourClass(){}
    void printAsFriend(MyClass m);
};
class MyClass{
    private: int i;
    public:
    MyClass(){}
    friend void YourClass::printAsFriend(MyClass m);
};
void YourClass::printAsFriend(MyClass m)
{ cout << m.i; }

int main(){
    return 0;
}

但这并没有-

#include <iostream>
using namespace std;
class YourClass;
class MyClass{
    private: int i;
    public:
    MyClass(){}
    friend void YourClass::printAsFriend(MyClass m);
};
class YourClass:public MyClass{
    public:
    YourClass():MyClass(){}
    void printAsFriend(MyClass m);
};
void YourClass::printAsFriend(MyClass m)
{ cout << m.i; }

int main(){
    return 0;
}

我收到以下错误:

refFile.c:8:49: error: invalid use of incomplete type ‘class YourClass’ friend void YourClass::printAsFriend(MyClass m); ^ refFile.c:3:8: error: forward declaration of ‘class YourClass’ class YourClass; ^ refFile.c: In member function ‘void YourClass::printAsFriend(MyClass)’: refFile.c:5:16: error: ‘int MyClass::i’ is private private: int i; ^ refFile.c:16:14: error: within this context { cout << m.i; } ^

为什么这行不通?我错过了什么?是否不允许与派生的函数成为朋友class?

这与函数的好友关系无关,这是因为你不能引用你只转发声明的 class 的成员。

在你的第二个片段中,当时 MyClass 被定义 YourClass 只是前向声明 - 编译器还没有看到它的定义,所以不知道成员函数 printAsFriend 甚至存在。