私はこのコンセプトで苦労しています。 Stroustrupはここで何を取得していますか? 「表現が定義の一部である」クラスの特別な点は何ですか? 「コンクリートタイプ」は何と対照的ですか? (「抽象型」とは対照的だと思いますが、AFAIKでは抽象型のインスタンスを存在させることさえできないため、スタックにthatを配置できなかったことは明らかです。 、初期化など)
この「具体的なクラス」の説明に合わない、インスタンス化できるクラスのようなものはありますか?通常、私はBSを理解するのは非常に簡単だと思いますが、ここでは要点を逃しています。
具象クラスの基本的な考え方は、「組み込み型と同じように」動作するということです。たとえば、複素数型と無限精度の整数は、組み込みのintによく似ていますが、独自のセマンティクスと演算のセットがあることは言うまでもありません。同様に、ベクトルと文字列は、動作が優れていることを除いて、組み込み配列に非常に似ています(§4.2、§4.3.2、§4.4.1)。
具象型の特徴は、その表現が定義の一部であることです。ベクトルなどの多くの重要なケースでは、その表現は他の場所に格納されているより多くのデータへの1つ以上のポインターにすぎませんが、具象クラスの各オブジェクトに存在します。特に、これにより、
•具象型のオブジェクトをスタック、静的に割り当てられたメモリ、およびその他のオブジェクトに配置します(§6.4.2)。
•オブジェクトを直接参照します(ポインタや参照だけでなく)。
•オブジェクトを即時かつ完全に初期化します(例:コンストラクターを使用、§2.3.2)。そして
•オブジェクトをコピーする(3.3)。
Stroustrup、Bjarne(2013-07-10)。 C++プログラミング言語(第4版)(セクション16.3具象クラス; Kindleロケーション2373-2386)。ピアソン教育。キンドル版。
具体的なタイプはインスタンスを作成できるものですが、抽象的なタイプはそうではありません。たとえば、次のような典型的な教育階層について考えてみましょう。
class animal {
virtual void noise() = 0;
}
class dog: public animal {
void noise() { cout << "bark\n"; }
public:
human *master;
}
class cat: public animal {
void noise() { cout << "meow\n"; }
public:
std::vector<human *> slaves;
}
dog
またはcat
のインスタンスは、抽象的ではなく具体的であるため作成できます。一方、animal
のインスタンスを作成することはできません。インスタンスへのポインタ(または参照)のみを保持します。例えば:
void hungry(animal *a) {
a->noise();
}
Stroustrupが使用している用語では、animal
の-representationはclass animal
の定義に含まれていません。特定の種類の動物の表現は、ここではdog
またはcat
のいずれかのサブクラスで記述されます。
彼だけがAFAIKを使っている意味でBSが使っている言葉のようです。彼の意図を完全に理解しているとは思いません。
最初に同じセクションからの引用:
そのようなタイプは、抽象クラスやクラス階層内のクラスと区別するためにコンクリートタイプまたはコンクリートクラスと呼ばれます。
したがって、彼にとって、抽象クラスの非抽象子孫は具象クラスではありません(これは私が慣れているニュアンスではありません。私にとっては、すべての非抽象クラスが具象であることはよく知られている使い方です)、継承よりも実装の詳細ではありません。彼の具体的なクラスはスタンドアロンユーティリティのようです。
私がよく知っているもう1つの具体的な/抽象的な二分法は、データ構造です。抽象データ構造はその操作によって定義されます(たとえば、ディクショナリはルックアップ、挿入などを提供します)。具体的なデータ構造は、それらがどのように提供されるかを示します(たとえば、ハッシュテーブル)。表現が公開されているという彼の主張は、おそらくそれと関連しています(おそらく、表現が複雑さに及ぼす影響が原因です)。
プログラミングの要素のステパノフとマクジョーンズは、正規型の概念を使用しています。 Stroustrupもその概念を使用しており(セクション24.3.1)、具象型との違いがわかりません。 2つの推測: