父访问子专用/受保护

Parent access child private/protected

本文关键字:受保护 专用 访问      更新时间:2023-10-16

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

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 还可用于不将静态常量数据(虚拟静态常量)从基类传输到派生类

现代编译器使用一种称为去虚拟化的概念,我认为现在大多数编译器都是如此。

这对我继承多个对象没有多态性(虚拟)很有用。

这是一种众所周知的模式,也称为静态多态性

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

我需要以某种方式允许父母访问受儿童保护的数据,可以吗?

当然有可能。这些需要publicT的成员,或者你需要B<T>Tfriend类:

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

现场演示


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