use*_*525 18 c++ polymorphism base-class derived-class pure-virtual
我明白为什么会发生这种情况,但我一直试图解决它...这是我的代码在我的程序退出时生成错误(因此导致崩溃)时所做的事情...
pure virtual method called
SomeClass::~SomeClass()
{
BaseClassObject->SomePureVirtualMethod(this);
}
Run Code Online (Sandbox Code Playgroud)
void DerivedClass::SomePureVirtualMethod(SomeClass* obj)
{
//Do stuff to remove obj from a collection
}
Run Code Online (Sandbox Code Playgroud)
我从来没有打过电话,new SomeClass但我有一个QList<SomeClass*>我追加SomeClass*对象的东西.这个析构函数的目的SomeClass是告诉从它的集合中DerivedClass删除一个特定的实例.SomeClassQList<SomeClass*>
所以,在一个具体的例子......
BaseClass = Shape
DerivedClass = Triangle
SomeClass= ShapeProperties拥有对的引用Shape
所以,我从来没有打过电话,new ShapeProperties但我有一个QList<ShapeProperties*>内心Triangle.析构函数ShapeProperties是告诉从它的集合中Triangle删除特定属性.ShapePropertiesQList<ShapeProperties*>
K-b*_*llo 31
在调用析构函数时,已经调用了继承类的析构函数.在构造函数和析构函数中,对象的动态类型可以有效地被认为与静态类型相同.也就是说,当你从构造函数/析构函数中调用虚方法时,它不是被调用的它们的覆盖版本.
如果SomePureVirtualMethod需要在析构函数中调用,那么您将必须在类的析构函数中调用它,在该类的析构函数中,您需要的方法的实际定义是.
Alo*_*ave 11
当你virtual在Base类的析构函数中调用该方法时,SomeClass它调用Base类的method(SomePureVirtualMethod()),SomeClass这是一个没有定义的纯虚方法.因而错误.
为什么会这样?
该类型this的构造函数和析构函数是它的构造和析构函数被调用,因此动态调度在构造函数和析构函数不工作,你希望它在所有其他职能的工作类型.
为什么会崩溃?
因为从构造函数或析构函数调用纯虚函数是未定义的行为.
C++ 03 10.4/6状态
"可以从抽象类的构造函数(或析构函数)调用成员函数;对于从这样的构造函数创建(或销毁)的对象,直接或间接地对纯虚函数进行虚拟调用(10.3)的效果(或析构函数)未定义."
怎么避免呢?
只需确保不要从构造函数或析构函数中调用纯虚函数.除非您了解所涉及的动态,否则
不要virtual在构造函数或析构函数中调用方法.
| 归档时间: |
|
| 查看次数: |
39319 次 |
| 最近记录: |