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++ - 避免在具有继承的类之间重复 typedef

    c++模板变量代码效率

    Java 多态性和运行时方法匹配

    python - 如何将我自己的自定义属性添加到现有的内置 Python 类型?像一个字符串?

    c++ - 有谁知道一个好的/简单/免费/开放的 3d 建模程序?

    c++ - 没有形式参数的可变参数模板

    c++ - boost program_options自定义解析

    c++ - 如何定义来自非模板基类的成员函数

    java - 为什么不能在通用 catch 子句中捕获自定义异常

    C++虚拟函数调用与boost::function快速调用