c++ - 使继承的成员静态化

标签 c++ inheritance static-members

我要上课,AB , 和 BA 继承成员公开。

class A {
public:
    int a;
};

class B : A {
};

有没有办法让所有的继承成员都来自A静态下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 '继承继承权。

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

最佳答案

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

class B { 
    static A a;
};

因为你可能不会满足 LSP不管怎样,如果你想让继承的成员成为static


关于上下文,我只是在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 兼容总是一件好事。

关于c++ - 使继承的成员静态化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15707800/

相关文章:

c++ - 没有 "using"的模板基类的访问属性

c++ - "Static counter"类型行为异常

c++ - 仅 header 库中静态成员变量的正确 setter 和 getter

c++ - Visual Studio 2017 在使用 Poco Xml 文档时检测内存泄漏

c++ - 存储定义列表以实现最快查找的最佳方式

java - 不调用继承类的方法

c++ - 线程间共享类的静态数据

c++ - casting operator() - 转换为引用并转换为值

c++ - Qt 应用程序和 Google Breakpad

java - 如何检查对象是否属于子对象