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的实例? 或者没有错误地销毁它们? 贬低有效吗?
答案 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的答案。