C++ 多态性,为什么可以';我不能这样做吗? BaseA类 { } B类:公共基地A { } 模板 C类:公共媒介 { } void函数(void) { C myClass; //我似乎不能这样做…这不可能吗? 向量转换=((向量)myClass); }
请参阅代码中的注释,了解我正在尝试执行的操作。不可能,也不可能。想象一下,如果您有另一个类,C++ 多态性,为什么可以';我不能这样做吗? BaseA类 { } B类:公共基地A { } 模板 C类:公共媒介 { } void函数(void) { C myClass; //我似乎不能这样做…这不可能吗? 向量转换=((向量)myClass); },c++,oop,templates,polymorphism,C++,Oop,Templates,Polymorphism,请参阅代码中的注释,了解我正在尝试执行的操作。不可能,也不可能。想象一下,如果您有另一个类,X,它是从BaseA派生的。如果可以将转换为对象,则可以在其中插入X的实例,即使原始对象不允许这样做。你会破坏变量的语义 顺便说一下,java可以在C++中没有真正意义上的泛型,但是在C语言或C++中的强类型泛型语言中,你不能做到这一点(C语言中只有一个例外,但是无论如何,你不应该使用它)。 试一试 vector,它不是为此而设计的。)C和vector是完全不相关的类型,您必须明确定义这种转换(例如模板显
X
,它是从BaseA
派生的。如果可以将转换为对象,则可以在其中插入X
的实例,即使原始对象不允许这样做。你会破坏变量的语义
顺便说一下,java可以在C++中没有真正意义上的泛型,但是在C语言或C++中的强类型泛型语言中,你不能做到这一点(C语言中只有一个例外,但是无论如何,你不应该使用它)。
试一试
vector,它不是为此而设计的。)C
和vector
是完全不相关的类型,您必须明确定义这种转换(例如模板显式运算符向量(){…}
)
如果这样的转换是一项不常见的任务,对于类的性质来说,这不是很自然的事情,那么最好使用范围构造函数(参见编程人员的答案)
另外:如果vector
是std::vector
,那么从它派生不是一个好主意。它没有被定义为基类,通常您应该更喜欢包含而不是派生(因为它对您的客户机施加了更松散的耦合)。对于初学者来说,没有class@SLaks这不是什么问题。@R.MartinhoFernandes:为什么不呢?看起来他正试图将向量
转换为向量
列表与列表之间没有(继承)关系,而不管a和B之间的(继承)关系如何。@SLaks因为向量
保存副本。这种转换没有什么问题,只是它碰巧没有在std::vector
中定义,并且可能会发生切片。这是一个重要的问题。从任何STL容器继承都不是一个好主意,因为它们没有虚拟析构函数。如果必须,请将容器用作成员。您提出的解决方案在功能上很有用,但不会改变所需的行为,因为现在转换的是myClass的浅拷贝,而不是对同一向量的引用?@Alain Hereconverted
保存myClass
中对象的深拷贝。在原始版本中,如果它起作用,转换后的
将保存myClass
中对象的深度副本。发布的代码中没有引用。由于明显的原因,所需的行为是不允许的。如果在解析数组时忽略根据需要强制转换迭代器,那么这是最接近的。。。我认为目的是让这两个变量指向内存中的同一个对象。也许我做C#的时间太长了。协方差在这里并不重要。转换的对象是一个副本,包含(可能是切片的)原始对象的副本。将X
s插入其中效果很好(除了X
s将被切片的事实),因为它不会在原始对象中插入任何内容。
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);
}
vector<A> converted(myClass.begin(), myClass.end());