アップキャスト/ダウンキャストとは何ですか?


16

ポリモーフィズムについて学ぶとき、あなたは一般的にこのようなものを見ます

class Base { int prv_member; virtual void fn(){} }
class Derived : Base { int more_data;  virtual void fn(){} }

アップキャストまたはダウンキャストとは何ですか?ある(Derived*)base_ptr;アップキャストまたはダウンキャストは?

あなたは基地から離れてより具体的な何かに行くので、私はそれをアップキャストと呼びます。他の人々は、あなたが階層を下って、トップがルートである特定のものに行くので、それはダウンキャストであると私に言った。しかし、他の人々は私がそれを呼ぶものと呼ぶようです。

ベースptrを派生ptrに変換するとき、アップキャストまたはダウンキャストと呼ばれますか?そして、誰かが公式の情報源にリンクできるか、それがなぜそれを素晴らしいと呼んだのかを説明できるなら。



3
複製ではありません。この質問はそれが何であるかを尋ね、他の質問は誰が名前を思いついたかを尋ねます。
ロバートハーヴェイ

1
@RobertHarvey 「そして誰かが公式の情報源にリンクできるか、なぜそれが素晴らしいと呼ばれるのかを説明できるなら。」、しかし同意したが、それは質問の一部としてのみ考えられる。
スティーブンジュリス

Derivedクラスの仮想に注意してください。Derivedクラスをもう一度派生させない限り、それを書きたくないでしょう。void fn(){...}で十分です。
12

JustaPro:追加virtualは不要ですが、「痛い」ことはありません。その文脈で使用すべきでないと考える理由を詳しく説明していただけますか?
ニックブーガリス

回答:


17
Is (Derived*)base_ptr; an upcast or downcast?

ダウンキャストです。Wikipediaの記事を参照してください。

、オブジェクト指向プログラミングダウンキャストまたはタイプ改良することの行為である鋳造その派生クラスの1つに、基本クラスの参照。

多くのプログラミング言語では、参照先オブジェクトの型が実際にキャストされているのか、派生型であるのかをRTTIで確認し、そうでない場合はエラーを発行することができます。

言い換えると、基本クラス(親クラス)の変数に派生クラス(子クラス)の値がある場合、ダウンキャストが可能です...


9

ほとんどの言語(私の知る限り)では、一般化キャストは自動的に実行されます。したがって、通常、階層内のキャストについて話す場合は、特殊なキャストを指します。2つのタイプを分離したいほとんどの人は、継承階層をツリーと見なしているため、特殊キャストダウンキャストを呼び出します。そして、コンピューターサイエンスでは、ルートがトップにあると考えられています。この背後にある理由は、慣習、またはおそらく、コンピューター科学者の間の生物学者に対する根深い憎悪です。(意図されたすべてのしゃれ。)

編集:たぶんそれはトップ根の憎悪です。


LOLは+1する必要があります:)。

2

ページの上部に「ベース」、下部に葉を持つツリーを描画する通常の方法を考えてください。クラス階層をこのように表現し、ベースクラスを上部に、リーフを下部に配置すると、アップキャストとダウンキャストが文字通りになります。リーフからベースに向かってページを上に移動するものはキャストし、ページをベースからリーフに向かって移動するものはダウンキャストです。


2
しかし、木は上向きになり、その幹は地面から地面に出ています。(これが私がアップキャストを考え続ける理由です)

@ acidzombie24:しかし、コンピューターサイエンスに関する本では、ルートは一番上にあり、通常は説明したとおりに木が描かれていることがわかります。
ジェリーコフィン

私は知っているが、私はただ面白がっていた。木(本物のもの)とベース(基礎や私の足の下など)は、それを考えるのに悪い方法です:(。+1

5
@ acidzombie24:それらをオーストラリアの木と考えてください。
マーティンヨーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.