比方说,我们有一个集合类,如:覆盖功能参数/
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