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

时间:2017-03-20 13:03:51

标签: c++ c++11

我正在使用g++ 4.8.4 纯虚拟类Friend的朋友Derived无法访问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;
};

编译会出现以下错误:

  

错误:'virtual void Base :: doSomething()'是私有的

错误修正了doSomething()明确指出Derived

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

为什么?
它应该这样吗?

1 个答案:

答案 0 :(得分:4)

问题是doSomethingprivate中声明为Base。这意味着即使是派生类也无法访问它。将其移至protected,它应该有效:

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

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