c++11纯虚类之友无法访问私有方法
Posted
技术标签:
【中文标题】c++11纯虚类之友无法访问私有方法【英文标题】:c++11 friend of pure virtual class can't access private methods 【发布时间】: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 仍然可以覆盖它。
【参考方案1】:
问题是doSomething
在Base
中被声明为private
。这意味着即使是派生类也不能访问它。将其移至protected
,它应该可以工作:
class Base
protected:
virtual void doSomething() = 0;
;
此外,由于Derived
没有实现该功能,它也将被视为抽象基类(您不能创建实例)。
【讨论】:
哦,我觉得很丢脸。谢谢!以上是关于c++11纯虚类之友无法访问私有方法的主要内容,如果未能解决你的问题,请参考以下文章