比方說,我們有一個集合類,如:覆蓋功能參數/
class CCollection {
public:
void add(B& b);
void remove(B& b);
void doSomethingWithAllObjects();
protected:
std::vector<B*> bs;
}
其中B是一個抽象類和
doSomethingWithAllObjects();
具體行爲取決於具體的B型,通話它C.
有沒有一種方法來推導CCollection,讓方法
add(B b);
remove(B b);
只接受派生類型?
我想到了什麼樣覆蓋這樣的方法:
class D : A{
public:
void add(C c);
void remove(C c);
void doSomethingWithAllObjects();
private:
std::vector<B*> bs;
}
或通用javaish構建像
template<class T : B>
class C {
...//do lots of stuff
}
推導幾乎是100%相同。但是你不能混用不同的B派生。
我已經讀過幾乎不可能將模板類限制到某些類型,但必須有一種方法來避免爲每個B的派生編寫一個整體類。重點是,我需要在B中定義的功能,所以我不能用一個簡單的模板
template<class T>
class B{
....
}
我當然可以假設其他程序員只是交出正確類型的權利CCollection但是這不能成爲精神。我想要的是強制其他程序員只添加一種類型的Bs。
歡迎來到Stack Overflow!如果我正確地閱讀你的問題,似乎有一個基本的設計問題。虛擬函數允許在* runtime *處確定行爲。並且,在運行時條件已知之前,更改該參數的類型將在編譯時執行。你希望在編譯時執行什麼? – 2013-04-21 16:41:11
只接受派生類型?是不是基類抽象?你不能聲明它的一個對象。那麼你怎麼能通過它來添加和刪除?我在這裏錯過了什麼嗎? – stardust 2013-04-21 16:44:12
我不確定你是如何從值參數'add(B b)'轉換成一個存儲在你的向量中的指針'std :: vector '似乎你可以採取的唯一的地址是參數的死亡地址函數結尾'add()' – 2013-04-21 16:46:03