基本クラス Token があります。これには実装がなく、マーカー インターフェイスとして機能します。これは、呼び出し元が使用する型です。
{
Token t = startJob(jobId);
// ... (tasks)
// t falls out of scope, destructors are called
}
派生クラス LockToken があります。これはミューテックスをラップし、構築中にロックが取得され、破棄中に解放されることを保証します。startJob メソッドは、トークン (ロックを提供しない) または LockToken (ロックを提供する) を返すかどうかを決定するという意味で、ファクトリ メソッドです。
Token startJob(int jobId)
{
return (jobId>0) ? LockToken() : Token() ;
}
startJob が基本インスタンス (トークン) を返す場合、すべてがうまく機能します。それ以外の場合 (jobId>0)、派生インスタンスからベース インスタンスへのコピーが作成されます。他のワークでは、別のトークンが LockToken からコピー構築され、元の LockToken があまりにも早くスコープから外れ、startJob のスコープ内でロックが解放されます。
どうすればこの問題を解決できますか? startJob を変更して、真の共変トークン (LockToken である可能性があることを意味する) を返すか出力することはできますか?