在多个继承C 之间进行铸造和释放

Casting and freeing between multiple levels of inheritance c++

本文关键字:释放 之间 继承      更新时间:2023-10-16

命令在铸造时是否很重要,这是否对使用虚拟基类释放对象有影响吗?例如。如果您提高了2个级别,则必须降低2个级别,或者您一次可以降低1级?

struct A {
    virtual ~A() = default;
    ...
};
struct A_Extra : A {...};
struct B : A_Extra {...};
std::vector<A*> data;
void scenario1() {
    // create sample object - incremental upcasting
    A_Extra* b = new B();
    data.push_back(b);
    A* a = data.front();
    // which one(s) of these casts are valid ?
    B* option1 = static_cast<B*>(static_cast<A_Extra*>(a));
    B* option2 = static_cast<B*>(a);
    // which one(s) of these frees are valid ?
    delete a;
    delete static_cast<A_Extra*>(a);
    delete static_cast<B*>(static_cast<A_Extra*>(a));
    delete static_cast<B*>(a);
}
void scenario2() {
    // create sample object
    B* b = new B();
    data.push_back(b);
    A* a = data.front();
    // which one(s) of these casts are valid ?
    B* option1 = static_cast<B*>(static_cast<A_Extra*>(a));
    B* option2 = static_cast<B*>(a);
    // which one(s) of these frees are valid ?
    delete a;
    delete static_cast<A_Extra*>(a);
    delete static_cast<B*>(static_cast<A_Extra*>(a));
    delete static_cast<B*>(a);
}

施放时订单很重要

是的,命令在铸造时很重要。

这是否会影响释放...

您所显示的演员都没有效果。

...使用虚拟基类?

您的班级都没有虚拟基类。

例如。如果您提高了2个级别,则必须降低2个级别,或者您一次可以降低1级?

您可以一次上升和降低多个级别,并且您的降落比您的降低范围少。


// which one(s) of these casts are valid ?

两者都是有效的。

// which one(s) of these frees are valid ?

所有这些都是有效的(只要仅使用其中一个(。

答案适用于两个screnarios。

铸造到B*A_Extra*可能是危险的,因为A*可能无法指向这种类型的对象。在这些情况下,它们确实如此,如果您可以保证,那么演员阵容是有效的。如果无法保证,dynamic_cast是一种更安全的替代方案。

无论如何,在两种情况下的所有演员阵容都是多余的。最好不要使用不必要的铸件。