【问题标题】:c++11 friend of pure virtual class can't access private methodsc++11纯虚类之友无法访问私有方法
【发布时间】: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 仍然可以覆盖它。

标签: c++ c++11


【解决方案1】:

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

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

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

【讨论】:

  • 哦,我觉得很丢脸。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2015-09-13
  • 2011-09-08
  • 2018-11-16
  • 2021-05-29
  • 1970-01-01
相关资源
最近更新 更多