ポリモーフィズムと親子関係に問題があります。次の2つのクラスを受講し、私のアプリケーションで「子」のオブジェクトを作成すると想像してください。オブジェクトの外では、私が呼び出す唯一の関数はupdate()であり、これはオブジェクト内で必要な他のすべてを呼び出します。この一連の呼び出しで「親」と「子」が異なる唯一の関数はdosomething2()です。
class parent
{
public:
void dosomething1() {}; //amongst other things, calls dosomething2
void dosomething2() {};
void update() {}; //amongst other things, calls dosomething1
}
class child : public parent
{
void dosomething2() {}
}
'child'のオブジェクトを作成してupdate()を呼び出すと、親クラスの関数のみが呼び出されることに気付きました。update()とdosomething1()を子クラスにコピーする必要がありましたが、すべてが期待どおりに機能しました。重複コードがたくさんあるので、それはあまり良い解決策ではありません-これを改善する方法はありますか?
更新: 提供された回答のおかげで、仮想dosomething2()関数で親クラスを更新しました。これで正しい関数が呼び出され、dosomething1()を子クラスにコピーする必要はありません。残念ながら、update()を子クラスにコピーしないと、シンボルルックアップエラーが発生します(親と子の両方が一緒にライブラリにあります)。
class parent
{
public:
void dosomething1() {}; //amongst other things, calls dosomething2
virtual void dosomething2() {};
void update() {}; //amongst other things, calls dosomething1
}
class child : public parent
{
void dosomething2() {}
/*void update() {}; //symbol lookup error if this is left uncommented */
}
UPDATE2 シンボルルックアップエラーはコードに関連していませんでした。私はmakecleanを実行し、次にmake(.soライブラリと実行可能ファイルをビルドします)を実行しました。これで、期待どおりに動作します。