C++ 容器 父类转子类 子类转父类

Posted on Dec 17, 2019

众所周知,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 条目.