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

众所周知,C++中父类子类的互转可以使用 dynamic_cast 进行类型转换,但是可能会丢失一些数据

如果是容器里面的父类,子类互转的话,就要用到 reinterpret_cast 进行转换,同样的也会丢失一些数据

先随便声明 3 个类

class A {
public:
    int a = 1;
};

class B : A {
public:
    int b = 2;
};

class C : B {
public:
    int c = 2;
};

主函数如果这么写的话,就是由父类 A 转为子类 B。

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

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  条目.

C++ 容器 父类转子类 子类转父类》上有2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注