更新:この問題は、メモリの使用率が低いために発生します。下部の解決策を参照してください。
ここにいくつかの半疑似コードがあります:
class ClassA
{
public:
virtual void VirtualFunction();
void SomeFunction();
}
class ClassB : public ClassA
{
public:
void VirtualFunction();
}
void ClassA::VirtualFunction()
{
// Intentionally empty (code smell?).
}
void ClassA::SomeFunction()
{
VirtualFunction();
}
void ClassB::VirtualFunction()
{
// I'd like this to be called from ClassA::SomeFunction()
std::cout << "Hello world!" << endl;
}
C# に相当するものは次のとおりです。C# の例は、実際の問題とは関係がないため削除されました。
ClassB::VirtualFunction
から呼び出されたときに関数が呼び出されないのはなぜClassA::SomeFunction
ですか? 代わりClassA::VirtualFunction
に呼び出されています...
仮想関数 ClassA::VirtualFunction の実装を強制すると、次のようになります。
class ClassA
{
public:
virtual void VirtualFunction() = 0;
void SomeFunction();
}
class ClassB : public ClassA
{
public:
void VirtualFunction();
}
void ClassA::SomeFunction()
{
VirtualFunction();
}
void ClassB::VirtualFunction()
{
// I'd like this to be called from ClassA::SomeFunction()
std::cout << "Hello world!" << endl;
}
派生関数が確実に宣言および定義されているにもかかわらず、実行時に次のエラーが発生します。
pure virtual method called
terminate called without an active exception
注:メモリ使用量が悪い場合でも、エラーが発生する可能性があるようです。詳細については、自己回答を参照してください。
更新 1 - 4:
コメントは削除されました (関係ありません)。