数日間気になる質問があります。
抽象クラスは、インスタンス化できない特別なタイプのクラスですよね?. (これは、少なくとも 1 つのメソッド宣言に「= 0」を与えることによって示され、指定されますが、これは後付けのように見えます)。
抽象クラスのメカニズムが C++ にもたらす、「通常の」基本クラスでは達成できない追加の利点は何ですか?
数日間気になる質問があります。
抽象クラスは、インスタンス化できない特別なタイプのクラスですよね?. (これは、少なくとも 1 つのメソッド宣言に「= 0」を与えることによって示され、指定されますが、これは後付けのように見えます)。
抽象クラスのメカニズムが C++ にもたらす、「通常の」基本クラスでは達成できない追加の利点は何ですか?
これは、クラスの設計者とそのクラスのユーザーとの間で契約を強制する方法です。抽象クラスから具象クラス (インスタンス化できるクラス) を作成する場合は、基本クラスの各抽象メンバー関数に対応するメンバー関数を宣言および定義する必要があります。
前述のように、これは派生クラスが従わなければならないインターフェイスを定義する方法です。彼らのVehicle抽象クラスの例は非常に適切です:Vehicle実生活では、フォード エクスプローラーやトヨタ プリウスを持っていることはありませんが、どちらも (議論のために) 機能の基本セットに準拠しています。それVehicleは定義するかもしれません。Vehicleしかし、ただディーラーに行ってオフロードを運転することはできませんVehicle。Vehicleしたがって、特殊化された派生オブジェクトが本当に必要な場合に、基本オブジェクトを構築して使用できるようにしたくはありません。
これは、デフォルトの実装なしでインターフェイスを定義するためのC++の最良の方法を提供します。
interfaceC ++にはC#の概念がありません。
これは、Java が「インターフェース」に変わったものと同等です。基本的に、これはクラス自体が使用できないことを意味します。すべての純粋なメソッドをオーバーライドする必要があります。
例は、純粋な OnDraw メソッドを持つ MFC の CView クラスです。基本的な CView は何も実行せず、役に立たないものです。OnDraw をオーバーライドする必要があります。
(ところで、純粋なメソッドの実装を提供することはまだ可能であり、サブクラス化された実装はそれにフォールバックできますが、それでも独自のオーバーライドを提供する必要があります。)
これらは、クラス階層設計の基本クラスとして使用されます。
抽象クラスは、すべての派生クラスのクリーンなインターフェイスを定義するために使用されます。
設計段階で、抽象クラスは仕様ごとにインターフェースを定義し、派生クラスはそれに応じて目的の機能を実装します。
また、「通常の」クラスの代わりに抽象クラスを使用すると、実装の詳細をインターフェイスから分離するのに役立ちます。
具象クラスはインターフェースを実装しますが、抽象クラスはそれを定義します。具象クラスを設計の基本クラスとして使用できますが、抽象クラスはコードで直接使用することを意図しておらず、インスタンス化できません。それらはプロトタイプとして機能します。
あなたが言うように「通常の」クラスを使用することにより、すべてのメソッドの実装を定義する必要があります。
クラスレベルで考えないでください。
メソッドを見て、デフォルトの場合に何をすべきかを考えてください。
virtual std::string getName() const = 0;
このメソッドの正しい実装は何でしょうか? 思いつくものはありません。
「純粋な仮想」とマークすることで、ユーザーがインターフェイスから派生したクラスのインスタンスを取得した場合に、このメソッドが適切な動作をするようになります。
これを行う唯一の他の方法はthrow NotImplemented("getName");本体ですが、コンパイル時ではなく実行時に問題が発生するため、それほど良くありません:)