我正在使用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;
};
为什么?
它应该这样吗?
答案 0 :(得分:4)
问题是doSomething
在private
中声明为Base
。这意味着即使是派生类也无法访问它。将其移至protected
,它应该有效:
class Base {
protected:
virtual void doSomething() = 0;
};
此外,由于Derived
未实现该函数,因此它也将被视为抽象基类(您无法创建实例)。