父访问子专用/受保护
Parent access child private/protected
是否有可能以某种方式允许父级访问受子保护的成员?
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;
// ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
}
};
我需要以某种方式允许父母访问受儿童保护的数据,可以吗?
当然有可能。这些需要public
T
的成员,或者你需要B<T>
T
的friend
类:
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>
中声明的特定接口的访问。
相关文章:
- C++:无法访问声明的受保护成员
- 继承和友元函数,从基类访问受保护的成员
- 为什么派生类的好友不能使用受保护的成员?
- C++:为什么无法在派生类中访问受保护的构造函数?
- 公共/私有/受保护是否会更改内存中结构的排列?
- 在父类中公开受保护的构造函数
- 如何从其他结构访问受保护的结构变量
- 如何实现返回受保护结构的私有函数
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 从模板化父类中的派生内部类访问受保护的成员变量
- 为什么继承的受保护构造函数不能公开?
- 在使用受保护和继承时无法访问在类中声明的私有成员
- C++中的受保护变量
- 在此上下文中受保护 c++
- 同一模板类但模板类型的受保护成员
- 基类中受保护的纯虚函数如何被基类的友元类使用?
- 受保护的嵌套结构不能用作派生外部类中的返回类型?
- 父访问子专用/受保护
- 提供受保护模板成员函数的公共专用化
- 模板专用化中出现受保护成员访问错误