假设我们有一个 Collection 类,例如:
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,但这不是精神。我想要的是强迫其他程序员只添加一种类型的 B。