汎用的に設計されたクラスがあり、どこでも使用できます。これは次のようになります。
class FixedByteStream {
public:
FixedByteStream(const char* source)
{
size = strlen(source);
copy(source);
}
/* Many more constructors here */
protected:
void copy(const char* source)
{
address = allocate();
//...
}
/* Plus other functions that call allocate() */
char* FixedByteStream::allocate()
{
return (char*)malloc(size);
}
}
次に、このクラスを拡張して、プロジェクト固有のメモリプールを使用できるようにしました。
class PooledByteStream : public FixedByteStream {
public:
PooledByteStream::PooledByteStream() : FixedByteStream() {}
protected:
char* PooledByteStream::allocate()
{
return (char*)PooledByteStream::pool.allocate(size);
}
}
PooledByteStreamはFixedByteStreamと同じであると想定されていますが、allocate()が呼び出されたときにメモリプールからポインタを取得する必要があることを除いて、すべて同じ関数とコンストラクタがあります。
ただし、PooledByteStream :: alllocate()が呼び出されることはありません。継承されたコンストラクターからでも、他の継承された関数(継承されたcopy()を呼び出す)からでもありません。基本クラスから継承されたものはすべて、allocate()が今ではまったく異なることを行うはずであるという事実に完全に気づいていません。
問題は、どうすればそれを修正できるかということです。継承された関数に、基本クラスの関数ではなく、オーバーライドされた関数を呼び出させるにはどうすればよいですか?基本クラスから必要なすべての関数をコピーして貼り付けると、継承のポイントが失われるため、ここではそれが答えではないと思います。
注:私は、メモリ管理や、同じ最終結果に到達するための他の方法についてのアドバイスを探していません。これはほんの一例です!