1

我必须公开课、AB、和B继承成员。A

class A {
public:
    int a;
};

class B : A {
};

有没有办法让所有继承的成员都来自Astatic under B,或者创建它们staticA唯一的方法?


上下文

我正在构建一个内存管理器,这个管理器将控制特定类的实例使用的内存。

我会有类似的东西:

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'lize the继承。

我不确定这是否是做我正在做的事情的最佳方法,但这是迄今为止我能想到的最优雅的方法。

4

1 回答 1

4

我会使用组合而不是继承:

class B { 
    static A a;
};

由于无论如何您都不会满足LSP与 B ,如果您想创建继承的成员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 兼容总是一件好事。

于 2013-03-29T16:58:49.123 回答