【发布时间】:2019-12-13 04:10:05
【问题描述】:
我想将基类指针向量转换为子类指针向量。据我了解,对象切片在这里不适用,因为向量由指针组成。
使用txt_specific *o = (txt_specific *) x.front(); 投射单个对象有效,但我不知道如何一次投射整个向量。
#include <vector>
class txt_base {
int a;
};
class txt_specific : public txt_base {
int b;
void do_stuff(){};
};
int main() {
std::vector<txt_base *> x {new txt_specific()};
// This cast does not work
std::vector<txt_specific *> y = (std::vector<txt_specific *>) x;
return 0;
}
编辑:我尝试了this question 的答案,但似乎不起作用。
2。编辑:解释一下发生该问题的情况:下面的代码演示了它。实际的 parse 函数在不同的地方被多次调用。
#include <vector>
class txt_base {};
class txt_specific1 : public txt_base {};
class txt_specific2 : public txt_base {};
enum t {
TYPE1,
TYPE2
};
void parser1(std::vector<txt_specific1 *> vec) {}
void parser2(std::vector<txt_specific2 *> vec) {}
void parse(std::vector<txt_base *> &x, t type) {
// the cast would be needed in this function
switch (type){
case TYPE1: parser1(x); break;
case TYPE2: parser2(x); break;
}
}
int main() {
std::vector<txt_base *> x {new txt_specific1()};
parse(x, TYPE1);
return 0;
}
【问题讨论】:
-
您不能一次投射整个向量。无论 X 和 Y 是什么,vector
都不能转换为 vector 。真正的问题是您为什么要这样做,您要解决什么问题? -
你不能,你也不需要它。
-
您可能不想转换用户定义类的对象。
-
“但它似乎不起作用” 以什么方式?做什么?你没有告诉我们你想做什么。只有你认为你想做的事情。
-
带有基类指针的向量被传递给函数。然后,此函数根据通过不同参数知道的 txt 类型(子类)调用不同的解析器
标签: c++ inheritance casting