我要上课,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
.这就是为什么我想到了 static
'继承继承权。
我不确定这是否是完成我正在做的事情的最佳方式,但这是迄今为止我能想到的最优雅的方式。
最佳答案
我会使用组合而不是继承:
class B {
static A a;
};
因为你可能不会满足 LSP不管怎样,如果你想让继承的成员成为static
。
关于上下文,我只是在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 兼容总是一件好事。
关于c++ - 使继承的成员静态化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15707800/