【问题标题】:Fine grained access specifiers c++细粒度访问说明符 c++
【发布时间】:2012-06-05 20:39:33
【问题描述】:

我有以下课程:-

class A {
  public:
    // some stuff that everyone should see
  protected:
    // some stuff that derived classes should see
  private:
    // some stuff that only I can see
    void f();
    void g();
};

现在,我希望 f() 只能从特定的类集(例如 B、C、D 类)访问,而 g() 可以从特定的其他类集(例如 D、E、 F)。有没有办法在 C++ 中指定这个?如果我让所有班级成为 A 的朋友,那么 f 和 g 都可以从 B、C、D、E、F(以及 A 的其他私有成员)访问,这不是我想要的。

这是可能的还是我应该改变我的对象模型?

【问题讨论】:

  • AFAIK 这在 C++ 中是不可能的。为什么不在接口中定义所需的方法,在类中实现接口,并用接口指针而不是类实例指针来提供其他类?
  • @Vlad 我想尽可能避免多重继承。
  • 嗯,接口级别的多重继承是无害的
  • 是吗?它仍然会创建一个虚拟表,并且调用除第一个基类的虚拟函数之外的任何东西都会因为 thunk 调整而稍微降低效率,对吧?在大多数情况下,这无关紧要,但我正在从事一个对性能要求很高的项目。
  • 您认为为什么需要如此细粒度的控制?

标签: c++ oop private-members access-specifier


【解决方案1】:
class A_f {
    friend class B;
    void f();
};

class A_g {
    friend class C;
    void g();
};

class A: public A_f, public A_g {
    friend class A_f;
    friend class A_g;
private:
    void do_f();
    void do_g();
};

inline void A_f::f() { static_cast<A *>(this)->do_f(); }
inline void A_g::g() { static_cast<A *>(this)->do_g(); }

void B::something(A *a) {
    a->f();
}

【讨论】:

    猜你喜欢
    • 2014-09-09
    • 1970-01-01
    • 2022-01-03
    • 2017-09-17
    • 2018-01-30
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多