如何使用友元函数和继承拆分定义和声明

How to split definition and declaration with friend function and inheritance

我需要编译这样的东西:

struct Base {
    virtual void func1()=0;
    // ...
    friend void Derived::func2(Base *base);
private:
    int some_private;
}

struct Derived : Base {
    virtual func3()=0;
    // ...
    void func2(Base *child) {
        std::cout << child->some_private;
    }
};

但我一直收到编译错误。我尝试交换结构或先声明它们,但我不能先声明 Derived(因为继承),我不能先声明 Base(因为我需要在 Derived 中声明友元函数)。怎么办?

您有一些基本的解决方案。最明显的是从 private 变为 protected。在 C++ 中,protected 意味着 subclasses 可以访问。

您可以改为添加更多 public(可能受保护)访问器方法。

您可以前向引用整个 Derived class 并将整个 class 添加为好友。

就我个人而言,我从未觉得需要使用友元方法或 classes,而且我不知道在什么情况下我才不会依赖其他方法完成我想要完成的任何事情。

对于这个特定的解决方案,我会将访问权限更改为受保护。