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。看起来很简单。授予FriendBase 的访问权限或限制Friend 不使用privateDerivedFriend 之外的类的部分。 该方法在 Base 中是私有的。 Derived 不能调用它,它的朋友也不能。但是 Derived 仍然可以覆盖它。 【参考方案1】:

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

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

此外,由于Derived 没有实现该功能,它也将被视为抽象基类(您不能创建实例)。

【讨论】:

哦,我觉得很丢脸。谢谢!

以上是关于c++11纯虚类之友无法访问私有方法的主要内容,如果未能解决你的问题,请参考以下文章

C++ 析构函数:无法访问类中声明的私有成员

❥关于C++之友元类

PHP继承的父方法无法访问孩子的私有属性

无法访问junit测试类中的包私有方法

无法访问密码:它在用户中是私有的

用于访问无法从自定义域访问的 S3 私有内容的签名 URL