私はMicrosoft Visual C++ 2015で少し苦労しており、小さなプログラムで問題を再現することができました。C++:不可解な「純粋仮想関数呼び出し」エラー
class BaseClass {
public:
BaseClass()
: mValue(0)
, mDirty(true)
{}
virtual ~BaseClass() {}
virtual int getValue() const { if(mDirty) updateValue(); return mValue; }
protected:
virtual void updateValue() const = 0;
mutable bool mDirty;
mutable int mValue;
};
class DerivedClass : public BaseClass {
public:
DerivedClass() {}
protected:
void updateValue() const override
{
mValue++;
mDirty = false;
}
};
class Impersonator {
public:
Impersonator() {}
// conversion operator
operator DerivedClass() const
{
return DerivedClass();
}
// conversion method
DerivedClass toDerived() const
{
return DerivedClass();
}
};
、私は次の操作を実行したときに、私は「純粋仮想関数呼び出し」エラーを取得:以下のクラスを考えると、私はvoid use(const BaseClass&)
機能を変更することはできませんことを考えると
void use(const BaseClass &inst)
{
// calls `getValue` which in turns calls the virtual function 'updateValue'
int value = inst.getValue();
}
int main()
{
// creates a temporary, then passes it by reference:
use(DerivedClass()); // this works
// calls conversion operator to create object on stack, then passes it by reference:
DerivedClass i = Impersonator();
use(i); // this works
// calls conversion method to create a temporary, then passes it by reference:
use(Impersonator().toDerived()); // this works
// calls conversion operator to create a temporary, then passes it by reference:
Impersonator j = Impersonator();
use(j); // causes a pure virtual function call error!
return 0;
}
、私は何も変更することができますImpersonator
クラスで、デバッグエラーを生成せずに最後の呼び出しを使用できるようにするには?
Visual Studioのランタイムコンポーネントは正常ですか?たぶん一部の欠落しているコンポーネントがその問題を引き起こします。 – pilkington
'getValue'の最後の呼び出しの中でブレークポイントしてvtableポインタを調べると、MSVCは' BaseClass'オブジェクトを持っていると誤って考えます。 – Praetorian
http://stackoverflow.com/questions/99552/where-do-pure-virtual-function-call-crashes-come-from –