假设:
A类的对象包含一个对象数组。
这些对象中的每一个都必须实现一些接口IB,因为A使用IB的方法。
这些对象由客户端传递给A类的对象,它们是C类或其子类。必须将这些对象返回给客户端。
问题:A必须对C一无所知,只有IB,但A必须返回C.
C ++中是否有任何标准解决方案没有不安全的强制转换<>?
答案 0 :(得分:0)
我不认为A
不知道关于C
的任何,这是可能的。但是,让A
足够了解使用正确的接口在C ++中并不难。所有具有IB
的类都派生自单个抽象基类,其中接口定义为纯虚函数。这实际上对应于适当的C ++设计 - 将接口与实现分离 - 如在例如Sutter & Alexandrescu
否则,如果以上情况确实不可能,您可以使A
成为模板类,并将数组元素存储为void*
,使用{{1}解析类类型(在编译时) }。
答案 1 :(得分:0)
您可以使用模板实现完全安全的类。
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