多态性,为什么我不能这样做?

时间:2012-04-10 15:54:51

标签: c++ oop templates polymorphism

class BaseA
{
}

class B : public BaseA
{
}

template <class T>
class C : public vector<T>
{
}

void someFunction (void)
{
    C<B> myClass;

    // I can't seem to do this...is it not possible?
    vector<BaseA> converted = ((vector<BaseA>) myClass);
}

在代码中查看我正在尝试做的事情。

3 个答案:

答案 0 :(得分:12)

B的向量不是A的向量,即使B是A(我假设A和BaseA之间的混合)

尝试

vector<A> converted(myClass.begin(), myClass.end());

这可能就是你想要表达的内容。

(BTW继承自矢量is bad idea in general,它不是为此而设计的。)

答案 1 :(得分:3)

C<B>vector<A>是完全不相关的类型,您必须明确定义此类转化(例如template <typename TargetValueType> explicit operator vector<TargetValueType> () { ... })。

如果这种转换是一种不常见的任务,对于你的类的本质来说并不是很自然,那么最好使用范围构造函数(参见AProgrammer的答案)。

另外:如果vectorstd::vector,那么从中得出并不是一个好主意。它没有被定义为基类,通常你应该更喜欢包含而不是派生(因为它会对你的客户端施加更宽松的耦合)。

答案 2 :(得分:0)

没有办法没办法。想象一下,如果你有另一个来自X的课程BaseA。如果您可以获取converted对象,则可以在其中插入X的实例,即使原始对象不允许它。你打破了变量的语义。

顺便说一下,可以在Java中执行此操作,因为它们没有真正的泛型,但是在C#或C ++等强类型泛型语言中,您无法做到(使用C#中的一个例外,但无论如何你不应该在这种情况下使用它。)