Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多态性,为什么可以';我不能这样做吗? BaseA类 { } B类:公共基地A { } 模板 C类:公共媒介 { } void函数(void) { C myClass; //我似乎不能这样做…这不可能吗? 向量转换=((向量)myClass); }_C++_Oop_Templates_Polymorphism - Fatal编程技术网

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 Here
converted
保存
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());