关于c ++:多态性,为什么我不能这样做?

Polymorphism, why can't I do this?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class BaseA
{
}

class B : public BaseA
{
}

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

void someFunction (void)
{
    C myClass;

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

请参阅代码中的注释,了解我要做的事情。


即使b是a,b的向量也不是a的向量(我假设a和basea混合在一起)。

尝试

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

这可能是你想要表达的。

(从向量继承btw通常是个坏主意,它不是为这个而设计的。)


Cvector是完全无关的类型,您必须明确定义这种转换(例如template explicit operator vector () { ... })。

如果这样的转换是一个不常见的任务,这对于类的性质来说是不自然的,那么最好使用范围构造函数(请参见编程人员的答案)。

另外:如果vectorstd::vector的话,那么由它衍生出来不是一个好主意。它没有定义为基类,通常您应该更喜欢包含而不是派生(因为它对客户机施加了更宽松的耦合)。


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

顺便说一下,你可以在Java中这样做,在那里他们没有真正意义上的泛型,但是在一个强类型的泛型语言中,例如C语言或C++,你将无法做到这一点(C语言中有一个例外,但无论如何你不应该使用它)。