C++11 纯虚拟类的朋友无法访问私有方法

c++11 friend of pure virtual class can't access private methods

本文关键字:访问 有方法 朋友 虚拟 C++11      更新时间:2023-10-16

我正在使用g++ 4.8.4 .
纯虚类Derived的友Friend无法访问Derived的私有方法,除非明确声明纯虚函数。
法典:

class Friend;
class Base {
private:
    virtual void doSomething() = 0;
};
class Derived: public Base {
private:
    friend class Friend;
};
class Friend {
public:
    void doSomething() { derived->doSomething(); };
private:
    Derived* derived;
};

编译给出以下错误:

错误:"虚拟空虚基础::d oSomething(("是私有的

修复错误的是专门为Derived声明doSomething()

class Derived: public Base {
private:
    virtual void doSomething() = 0;
    friend class Friend;
};

为什么?
它应该那样做吗?

问题是doSomethingBase 中声明为 private 。这意味着即使是派生类也无法访问它。将其移动到protected,它应该可以工作:

class Base {
protected:
    virtual void doSomething() = 0;
};

此外,由于Derived没有实现该函数,因此它也将被视为抽象基类(您无法创建实例(。