Apa itu upcasting / downcasting?

16

Ketika belajar tentang polimorfisme, Anda biasanya melihat sesuatu seperti ini

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

Apa itu upcasting atau downcasting? Apakah (Derived*)base_ptr;upcast atau downcast?

Saya menyebutnya upcast karena Anda akan pergi dari pangkalan ke sesuatu yang lebih spesifik. Orang lain mengatakan kepada saya itu downcast karena Anda akan turun ke hierarki sesuatu yang spesifik dengan yang atas menjadi root. Tetapi orang lain tampaknya menyebutnya apa yang saya sebut itu.

Ketika mengkonversi ptr basis ke ptr turunan apakah ini disebut upcasting atau downcasting? dan jika seseorang dapat menautkan ke sumber resmi atau menjelaskan mengapa ini disebut hebat.


sumber
3
Terkait: "Siapa yang memutuskan terminologi downcasting dan upcasting?" Sebenarnya ... duplikat?
Steven Jeuris
3
Itu bukan duplikat. Pertanyaan ini menanyakan apa itu, yang lain bertanya siapa yang muncul dengan nama-nama itu.
Robert Harvey
1
@RobertHarvey "dan jika seseorang dapat menautkan ke sumber resmi atau menjelaskan mengapa ini disebut hebat." , tetapi setuju, itu bisa dianggap hanya sebagian dari pertanyaan.
Steven Jeuris
hati-hati dengan virtual di kelas turunan. Anda tidak ingin menulis itu kecuali Anda mendapatkan kelas Turunan sekali lagi. void fn () {...} sudah cukup.
appoll
JustaPro: menambahkan virtualtidak perlu tetapi tidak "sakit". Bisakah Anda menguraikan mengapa Anda pikir itu tidak boleh digunakan sama sekali dalam konteks itu?
Nik Bougalis

Jawaban:

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

Ini adalah downcast: lihat artikel Wikipedia di atasnya.

Dalam pemrograman berorientasi objek , downcasting atau jenis perbaikan adalah tindakan casting referensi kelas dasar ke salah satu kelas turunannya.

Dalam banyak bahasa pemrograman, dimungkinkan untuk memeriksa melalui RTTI apakah jenis objek yang direferensikan memang yang dilemparkan ke atau jenis turunannya, dan dengan demikian mengeluarkan kesalahan jika bukan itu masalahnya.

Dengan kata lain, ketika variabel kelas dasar ( kelas induk ) memiliki nilai kelas turunan ( kelas anak ), downcasting dimungkinkan ...

Robert Harvey
sumber
9

Dalam sebagian besar bahasa (sejauh yang saya tahu) pemeran umum dilakukan secara otomatis. Jadi, biasanya jika Anda berbicara tentang pemeran dalam hierarki, Anda merujuk pada pemeran khusus. IMHO sebagian besar orang dengan keinginan untuk memisahkan kedua jenis panggilan yang dikhususkan downcast karena mereka menganggap hierarki warisan sebagai pohon. Dan dalam ilmu komputer, root digambarkan berada di atas. Alasan di balik ini adalah konvensi, atau, lebih mungkin, kebencian yang mengakar mendalam bagi para ahli biologi di antara para ilmuwan komputer. (Semua permainan kata-kata dimaksudkan.)

EDIT: Mungkin itu adalah kebencian yang mengakar.

scarfridge
sumber
LOL harus memberi +1 :).
2

Pikirkan cara normal menggambar pohon dengan "alas" di bagian atas halaman dan daun di bagian bawah. Jika Anda mewakili hierarki kelas Anda dengan cara ini, dengan kelas dasar di bagian atas dan daun di suatu tempat di bawah ini, maka naik-turun dan turun-casting menjadi literal - sesuatu yang bergerak naik halaman dari daun ke arah dasar adalah naik- gips dan sesuatu yang bergerak ke bawah halaman dari pangkal ke arah daun adalah gips ke bawah.

Jerry Coffin
sumber
2
Tapi pohon-pohon naik ke atas dan batangnya ada di tanah yang keluar dari tanah. (Inilah sebabnya saya terus berpikir upcast)
@ acidzombie24: Tetapi dalam buku-buku tentang ilmu komputer, Anda akan menemukan bahwa pohon biasanya digambar seperti yang saya jelaskan, dengan akar di atas.
Jerry Coffin
Saya tahu tetapi saya hanya menjadi lucu. Pohon (yang asli) dan pangkalan (seperti fondasi dan di bawah kaki saya) adalah cara yang buruk untuk memikirkannya :(. +1
5
@ acidzombie24: Anggap saja mereka pohon di Australia.
Martin York