4
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);
}

请参阅代码中的注释以了解我正在尝试做的事情。

4

3 回答 3

12

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

尝试

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

这可能是你想要表达的。

(顺便说一句,从 vector 继承通常是个坏主意,它不是为此而设计的。)

于 2012-04-10T15:58:11.637 回答
3

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

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

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

于 2012-04-10T15:58:39.280 回答
0

没办法没办法。想象一下,如果你有另一个类,X,派生自BaseA。如果你能得到你的converted对象,你可以在其中插入实例X,即使原始对象不允许它。您将破坏变量的语义。

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

于 2012-04-10T15:57:56.520 回答