我如何才能将基 class 中的派生 class 函数加好友?

How can I friend a derived class function in the base class?

我有以下代码:

#include <iostream>

class A {
    private:
        int a;
    public:
        void setA(int a_);
    friend int B::getA();
};

class B : public A {
    public:
        int getA();
};

void A::setA(int a_) {
    a = a_;
}

int B::getA() {
    return a;
}

int main() {
    B myB;
    myB.setA(9);

    std::cout << myB.getA()<< std::endl;
    return 0;
}

用 g++ 编译产生:

friend.cpp:10:16: error: use of undeclared identifier 'B'
    friend int B::getA();

我的想法是,当编译器正在通过 class A 定义时,它还不知道 class B。因此,我可以转发声明 B 来解决这个问题:

#include <iostream>

class B;

class A {
...

这不太行:

friend.cpp:10:16: error: incomplete type 'B' named in nested name specifier
    friend int B::getA();

编译器似乎无法解析给定的函数。

如何使派生的 class 函数成为基 class 中的朋友?

您的代码似乎违反了数据封装的基本概念。要解决它,请按照@rici 的建议使 A::a 受到保护,或者在 class A 中定义 getter。

class A {
private:
   int a;
public:
   void setA(int a_);
   virtual int getA();
};

class B : public A {
public:
   int getA();
};

void A::setA(int a_) {
   a = a_;
}
int A::getA() {
   return a;
}

int B::getA() {
   return A::getA();
}