c++ - 父访问子私有(private)/ protected

原文 标签 c++ templates polymorphism

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

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当成 friend 类,
  • CRTP

  • 还有几点需要考虑,在使用 CRTP 时,请确保您使用内联,否则它不会使其更快(但可能会发生代码膨胀)。不要忘记使 B 构造函数 protected (在静态派生数据访问的情况下)。

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

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

    最佳答案

    This will be useful for me to inherit multiple objects without polymorphism(virtual).



    这是一种众所周知的模式,又名静态多态性。

    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;
                 // ^^^^^^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^
        }
    };
    

    I need to somehow allow parent to access child protected data, is it possible?



    当然这是可能的。这些必须是 public T 的成员, 或者你需要制作 B<T>一个 friendT :
    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> 中声明的特定接口(interface)的访问权限.

    关于c++ - 父访问子私有(private)/ protected ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37898554/

    相关文章:

    c++ - 使用unit64_t左移-发出警告

    c++ - C++模板编译错误

    c++ - AES128 在 CBC 模式下使用 Crypto++ 库实现

    c++ - 不允许从 C++ 中的某个类继承

    c++ - 侵入式数据结构中的成员钩子(Hook)与基本钩子(Hook)

    java - 为什么多态不能以相同的方式对待泛型集合和纯数组?

    c++ - std::find查找包含指针的 vector

    scala - 当类型参数之一应该是 Nothing 时,为什么 Scala 的隐式类不起作用?

    c++ - 在现代 C++ 游戏引擎中组织全局系统访问

    c++ - 如何在c++中旋转 vector 中的每个第N个元素