类A的对象包含一组对象。
每个对象都必须实现某些接口IB,因为IB的使用方法。
这些目的通过了由客户对象类A的,它们是类型C或它的孩子。必须将这些对象返回给客户端。
问题:一个肯定不知道关于C什么,只有约IB,但要求退还C.
是否有任何C标准溶液++没有不安全的类型转换<>?
类A的对象包含一组对象。
每个对象都必须实现某些接口IB,因为IB的使用方法。
这些目的通过了由客户对象类A的,它们是类型C或它的孩子。必须将这些对象返回给客户端。
问题:一个肯定不知道关于C什么,只有约IB,但要求退还C.
是否有任何C标准溶液++没有不安全的类型转换<>?
我不认为这是可能的A
不知道什么东西约C
。然而,拥有A
足够知道使用正确的界面在C++中并不那么困难。有IB
所有类从具有定义那里作为纯虚功能的接口的单个抽象基类派生。这实际上对应于正确的C++设计 - 将接口与实现分离 - 例如, Sutter & Alexandrescu。否则,如果上述确实是不可能的,则可以使A
为模板类,并将数组元素存储为void*
,使用static_cast
解析类类型(在编译时)。
你可以使用模板实现一种绝对安全的类。
template <typename T>class A
{
std::vector<IB*> myObj;
public:
void add(IB* anObj)
{
myObj.push_back(anObj);
}
void get(int anIndex, T*& anObj)
{
T* t = dynamic_cast<T*>(myObj[anIndex]);
anObj = t;
}
};
然后像这样使用。
A<C> a;
演示给出here
听起来像是你已经花了太多的时间编写Java。 C++没有与“class”分开的“接口”的概念。因此,IB必须是一个类,并且A可以简单地将一个(指针|引用)返回给IB。 C必须(显然)来自IB,但A不需要知道这一点。 – 2012-07-25 15:29:06
这个答案可能会给你一些想法:http://stackoverflow.com/questions/7950711/conversion-from-subclass-to-superclass-to-subclass/7950896#7950896 – ssube 2012-07-25 15:30:37
你说*不安全蒙上<> *仿佛' static_cast'等是不安全的。如果你正确使用它们,它们是完全安全的。 – chris 2012-07-25 15:31:28