父母访问子私人/受保护

时间:2016-06-18 15:19:41

标签: c++ templates polymorphism

是否有可能以某种方式允许父母访问受子保护的成员?

template <class T>
class B {
public :
    void print()
    {
        cout << T::a << T::b << endl;
    }
};

class C : public B<C>
{
protected :
    static int a;
    static int b;
public :
    C() {
        print();
    }
};

这对我来说很有用,可以在没有多态(虚拟)的情况下继承多个对象。任何建议??

修改:

我找到了两个解决方案,如下所示::

  • 将B作为朋友班,
  • CRTP

要考虑的几点,使用CRTP确保你使用内联其他方面它不会使它更快(但可能发生代码膨胀)。不要忘记保护B构造函数(在静态派生数据访问的情况下)。

CRTP也可用于不将静态常量数据(虚拟静态const)从基类传递到派生

现代编译器使用一种称为虚拟化的概念,我认为它现在在大多数编译器中。

1 个答案:

答案 0 :(得分:4)

  

这对我来说很有用,可以在没有多态(虚拟)的情况下继承多个对象。

这是一个众所周知的模式,又名为静态多态

CRTP通常使用static_cast<T*>(this)来引用派生类函数:

template <class T>
class B {
public :
    void print()
    {
        cout << static_cast<T*>(this)->a << static_cast<T*>(this)->b << endl;
             // ^^^^^^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^
    }
};
  

我需要以某种方式允许父级访问受子控制的数据,是否可能?

当然有可能。这些人必须是public T成员,或者您需要B<T> friend T个成员:

class C : public B<C>
{
     friend class B<C>;
  // ^^^^^^^^^^^^^^^^^^
protected :
    static int a;
    static int b;
public :
    C() {
        print();
    }
}; 

Live Demo

friend声明仍保留class C的封装,同时打开对class B<T>中声明的特定接口的访问权。