使继承成员静态

时间:2013-03-29 16:57:13

标签: c++ inheritance static-members

我必须上课,ABB公开继承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;使用继承权。

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

1 个答案:

答案 0 :(得分:4)

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

class B { 
    static A a;
};

如果您想要继承成员static,那么您仍然不能满足LSP与B一样。


关于上下文,我只想在Memory中创建一个静态保护的分配器:

class Memory {
protected:
    static void* allocate();
    static void destroy (void*);

并在newdelete运营商中使用它们:

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兼容总是一件好事。