我必须上课,A
和B
,B
公开继承A
成员。
class A {
public:
int a;
};
class B : A {
};
有没有办法让A
下的所有继承成员静态B
,或者在static
中创建A
是唯一的方法?
上下文:
我正在构建一个内存管理器,这个管理器将控制特定类实例使用的内存。
我有类似的东西:
template <class T>
class Memory {
public:
operator new;
operator delete;
private:
memory_pool_for<T>;
};
class Data : Memory<Data> {
};
所以,当我做了类似的事情时:
new Data;
delete Data;
将从Memory
中定义的函数调用该操作,该函数将分配/释放一些内存空间。
Data
实例中的分配/释放应该是静态的,并且我希望确保由于Data
的继承而不会向Memory
的每个实例添加额外的字节。 1}}。这就是为什么我想到static
&#39;使用继承权。
我不确定这是否是做我正在做的事情的最佳方式,但这是迄今为止我能想到的最优雅的方法。
答案 0 :(得分:4)
我会使用合成而不是继承:
class B {
static A a;
};
如果您想要继承成员static
,那么您仍然不能满足LSP与B一样。
关于上下文,我只想在Memory
中创建一个静态保护的分配器:
class Memory {
protected:
static void* allocate();
static void destroy (void*);
并在new
和delete
运营商中使用它们:
public:
void* operator new (size_t) { return allocate(); }
void operator delete (void* mem) { return destroy(mem); }
}
这样,当您从Memory
继承时,可以使用其静态分配器。
无论如何,我不确定这是不是一个好方法。它显然限制你到一个内存池(但那是你想要的,不是吗?)。如果您希望每个类型有一个内存分配器实例,只需将模板标记添加到Memory
并继承CRTP:
template<typename Tag> class Memory { ...
class Data : Memory<Data> {
};
您可能希望了解如何使用标准库容器分配器。与stdlib兼容总是一件好事。