Does order matter when casting and does this have an effect on freeing an object with a virtual base class? E.g. if you upcasted 2 levels, must you downcast 2 levels, or can you downcast 1 level at a time?
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);
}