【发布时间】:2017-03-20 13:03:51
【问题描述】:
我正在使用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;
};
编译出现以下错误:
错误:'virtual void Base::doSomething()' 是私有的
修复错误的方法是专门为Derived 声明doSomething():
class Derived: public Base {
private:
virtual void doSomething() = 0;
friend class Friend;
};
为什么?
应该这样吗?
【问题讨论】:
-
你让
Friend访问Derived,编译器抱怨你访问Base。看起来很简单。授予Friend对Base的访问权限或限制Friend不使用private除Derived和Friend之外的类的部分。 -
该方法在 Base 中是私有的。 Derived 不能调用它,它的朋友也不能。但是 Derived 仍然可以覆盖它。