是否有可能以某种方式允许父母访问受子保护的成员?
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();
}
};
这对我来说很有用,可以在没有多态(虚拟)的情况下继承多个对象。任何建议??
修改:
我找到了两个解决方案,如下所示::
要考虑的几点,使用CRTP确保你使用内联其他方面它不会使它更快(但可能发生代码膨胀)。不要忘记保护B构造函数(在静态派生数据访问的情况下)。
CRTP也可用于不将静态常量数据(虚拟静态const)从基类传递到派生
现代编译器使用一种称为虚拟化的概念,我认为它现在在大多数编译器中。
答案 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();
}
};
friend
声明仍保留class C
的封装,同时打开对class B<T>
中声明的特定接口的访问权。