在销毁基类之前销毁static_casted派生类

时间:2015-01-19 17:55:05

标签: c++

class A{
    someFunctionOfA(){}
};
class B:public A{
    someFunctionOfB(){}
};
int main()
{
    WorldObject w;
    B *b;
    b = static_cast<B*>( w.createA() ); // returns pointer to class A
    b->someFunctionOfB();
    b->someFunctionOfA();
    //delete b; //still gives error
    w.end(); //destroys instance of base class A
} //tries to destroy instance of B but generates error

如何在不破坏A的情况下销毁B的实例? 或者没有错误地销毁它们? 贬低有效吗?

2 个答案:

答案 0 :(得分:2)

如果实际指向基类的实例,则向下转换指向派生对象的指针是未定义的行为。无论如何,你的代码都被打破了。

答案 1 :(得分:1)

你在做什么是非法的!您不能将基类转换为子类,并期望该类像子类一样工作(我想象createA创建一个A类型的对象而不是B类型的对象转换为A!)。

第一季度: 你想要的是组合,为此,A应该保留一个指向B而不是继承的指针:

class A
{
   private: 
   B* m_pBComponent;
}

然后你可以在保持A时只删除B. 您不能仅删除派生对象的派生部分。

Q2: 使析构函数成为虚拟(除非你在A&#39的构造函数中有自定义分配,否则不是必需的,但它仍然是最佳实践)。

确保createA返回B类型的对象。

问题3:

请参阅ILoveCoding的答案。