众所周知,C++中父类子类的互转可以使用 dynamic_cast 进行安全的类型转换,但是可能会丢失一些数据
如果是容器里面的父类,子类互转的话,可以使用 reinterpret_cast 进行转换,同样的也会丢失一些数据
先随便声明 3 个类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class A {
public:
int a = 1;
};
class B : A {
public:
int b = 2;
};
class C : B {
public:
int c = 2;
};
|
主函数如果这么写的话,就是由父类 A 转为子类 B。
1
2
3
4
5
6
7
8
9
10
11
|
int main()
{
list<A> c_a;
list<B> c_b;
list<C> c_c;
for (int i = 0; i < 2; ++i) {
c_a.push_back(A());
}
c_b = *reinterpret_cast<list<B> *>(&c_a);
return 0;
}
|
这代码执行之后变量 c_a, c_b 的内容如图所示
可以看到,存储b的 c_b 容器中,b的值是0,而a的值依旧是1。
子类 C 转 子类 B
1
2
3
4
5
6
7
8
9
10
11
|
int main()
{
list<A> c_a;
list<B> c_b;
list<C> c_c;
for (int i = 0; i < 2; ++i) {
c_c.push_back(C());
}
c_b = *reinterpret_cast<list<B> *>(&c_c);
return 0;
}
|
执行之后的局部变量如图
丢失了 B 中不存在的变量c,其他一致
更高级的用法详见 cppreference 的 reinterpret_cast 条目.