2013-03-29 146 views
1

我必須上課,ABB公開繼承A成員。繼承成員靜態

class A { 
public: 
    int a; 
}; 

class B : A { 
}; 

有沒有辦法讓所有的繼承成員從BA靜態的,或者通過創建它們在Astatic是唯一的出路?


語境

我建立一個內存管理器,而這個經理會通過控制特定類的實例使用的內存。

我有類似:

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'繼承。

我不確定這是否是做我所做的最好的方法,但這是迄今爲止我能想到的最優雅的方法。

+0

簡答:沒有。你需要*實例*內部的靜態A. – WhozCraig

+1

在C++中沒有這樣的功能,我看不到一個必然需要它的具體用例。你爲什麼認爲你需要它? –

+0

如果您提供* real *用例,我們可能會想到更好的解決方案。現在,它確實不清楚你可能需要它。 –

回答

4

我會用組成,而不是繼承:

class B { 
    static A a; 
}; 

既然你不會就很有可能滿足LSP爲B,無論如何,如果你想繼承的成員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兼容總是一件好事。

+0

是的,這是每種類型的一個公共內存池。模板看起來很棒(:我會嘗試你的建議,非常感謝!5555 Interstella!(: – Rubens