手始めに...ポインタや参照なしでポリモーフィズムを持つことはできません。C ++では、従来、オブジェクトはコピーされ、(ほとんどの場合)自動保存期間があります。ただし、コピーはポリモーフィックオブジェクトでは機能しません。それらはスライスされる傾向があります。また、OOはアイデンティティを意味することもよくあります。つまり、コピーしたくないということです。したがって、解決策は、オブジェクトを動的に割り当て、ポインタを渡すことです。それらを使って行うことは、設計の一部です。
オブジェクトが論理的に別のオブジェクトの一部である場合、そのオブジェクトはその存続期間に責任があり、ポインターを受け取るオブジェクトは、所有するオブジェクトが消えた後にポインターを使用しないようにするための措置を講じる必要があります。(これは、ガベージコレクションのある言語でも当てはまります。オブジェクトへのポインタがある限りオブジェクトは消えませんが、所有オブジェクトが無効になると、所有オブジェクトも無効になる可能性があります。事実ガベージコレクターがメモリをリサイクルしないことは、指定したオブジェクトが使用可能であることを保証しません。)
オブジェクトが論理的に別のオブジェクトの一部ではなく、ファーストクラスのエンティティ自体である場合は、おそらくそれ自体を処理する必要があります。繰り返しになりますが、ポインタを保持している可能性のある他のオブジェクトは、存在しなくなった場合(または無効になった場合)に通知する必要があります。オブザーバーパターンの使用が通常の解決策です。私がC++を始めたとき、関係を登録するある種の管理クラスを備えた「関係管理」の流行がありました。これにより、すべてが正常に機能することが保証されたと思われます。実際には、それらは機能しなかったか、単純なオブザーバーパターン以上のことはしなかったため、今日ではそれ以上聞こえません。
ほとんどの場合、あなたの正確な質問は、各クラスがその機能ごとに確立しなければならない契約の一部です。真のOOクラス(エンティティオブジェクト)の場合、おそらくそれらを削除しないでください。それはあなたのビジネスではなく、ビジネスです。ただし、例外があります。たとえば、トランザクションを処理している場合、削除されたオブジェクトはロールバックできないため、オブジェクトがそれ自体を削除することを決定すると、通常、このファクトがトランザクションマネージャーに登録され、トランザクションマネージャーがその一部として削除します。コミットの場合、ロールバックが必要ないことが確立されたら。オブジェクトの変更に関しては、それは契約の問題です。多くのアプリケーションには、ある種の外部識別子をオブジェクトにマップするために使用されるマッピングオブジェクトがあります。多くの場合、オブジェクトを変更できるようにすることを目的としています。