การ upcasting / downcasting คืออะไร?


16

เมื่อเรียนรู้เกี่ยวกับความแตกต่างคุณมักเห็นสิ่งนี้

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

อัพซิสต์หรือดาวน์สตรีมคืออะไร? คือ(Derived*)base_ptr;upCast หรือเศร้าใจ?

ฉันเรียกมันว่า upcast เพราะคุณกำลังออกจากฐานไปสู่สิ่งที่เฉพาะเจาะจงกว่านี้ คนอื่นบอกฉันว่ามันเป็นการลดทอนเพราะคุณจะลดระดับลงในบางสิ่งที่เฉพาะเจาะจงโดยที่ด้านบนเป็นราก แต่คนอื่น ๆ ดูเหมือนจะเรียกสิ่งที่ฉันเรียกมันว่า

เมื่อแปลง ptr ฐานเป็น ptr ที่ได้รับมันเรียกว่า upcasting หรือ downcasting? และถ้าใครบางคนสามารถเชื่อมโยงไปยังแหล่งข้อมูลอย่างเป็นทางการหรืออธิบายว่าทำไมมันถึงเรียกว่ายิ่งใหญ่


3
ที่เกี่ยวข้อง: "ใครเป็นผู้ตัดสินใจเกี่ยวกับคำศัพท์ downcasting และ upcasting" จริงๆแล้ว ... ซ้ำกันเหรอ?
Steven Jeuris

3
มันไม่ซ้ำกัน คำถามนี้ถามว่ามันคืออะไรอีกคนถามว่าใครมากับชื่อ
Robert Harvey

1
@RobertHarvey "และหากใครบางคนสามารถเชื่อมโยงไปยังแหล่งข้อมูลอย่างเป็นทางการหรืออธิบายว่าทำไมมันถึงเรียกว่าดีกว่านี้" แต่เห็นด้วยซึ่งถือได้ว่าเป็นเพียงส่วนหนึ่งของคำถาม
Steven Jeuris

ระวังเวอร์ชวลนั้นในคลาส Derived คุณไม่ต้องการที่จะเขียนว่าเว้นแต่คุณจะได้รับชั้นเรียนที่ได้รับมาอีกครั้ง โมฆะ fn () {... } ก็เพียงพอแล้ว
appoll

JustaPro: การเพิ่มvirtualไม่จำเป็น แต่ไม่ "เจ็บ" คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับสาเหตุที่คุณคิดว่าไม่ควรใช้ในบริบทนั้นได้หรือไม่?
Nik Bougalis

คำตอบ:


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

มันเป็นความเศร้าใจ: การดูวิกิพีเดียบทความเกี่ยวกับมัน

ในการเขียนโปรแกรมเชิงวัตถุการลดทอนหรือการปรับแต่งประเภทเป็นการกระทำของการหล่อการอ้างอิงของคลาสฐานไปยังหนึ่งในคลาสที่ได้รับ

ในภาษาการเขียนโปรแกรมจำนวนมากเป็นไปได้ที่จะตรวจสอบผ่านRTTIว่าประเภทของวัตถุที่อ้างอิงนั้นเป็นวัตถุที่ถูกส่งไปหรือเป็นประเภทที่ได้รับมาจากนั้นจึงออกข้อผิดพลาดหากไม่ใช่กรณี

กล่าวอีกนัยหนึ่งเมื่อตัวแปรของคลาสพื้นฐาน ( คลาสพาเรนต์ ) มีค่าของคลาสที่ได้รับ ( คลาสย่อย ) การดาวน์สตรีมเป็นไปได้ ...


9

ในภาษาส่วนใหญ่ (เท่าที่ฉันรู้) การปลดเปลื้องแบบทั่วไปจะดำเนินการโดยอัตโนมัติ ดังนั้นโดยปกติถ้าคุณพูดถึงนักแสดงในลำดับชั้นคุณหมายถึงนักแสดงที่มีความเชี่ยวชาญ IMHO คนส่วนใหญ่ที่มีความปรารถนาที่จะแยกสองประเภทนี้เรียกว่า downcast cast ที่เชี่ยวชาญเพราะพวกเขาคิดว่าลำดับชั้นการสืบทอดเป็นต้นไม้ และในวิทยาการคอมพิวเตอร์รากนั้นเป็นภาพที่อยู่ด้านบน เหตุผลเบื้องหลังนี้อาจเป็นแบบแผนหรืออาจเป็นความเกลียดชังที่หยั่งรากลึกสำหรับนักชีววิทยาในหมู่นักวิทยาศาสตร์คอมพิวเตอร์ (ตั้งใจเล่นทั้งหมด)

แก้ไข: บางทีมันอาจเป็นความเกลียดชังที่หยั่งรากที่สุด


LOL ต้อง +1 :)

2

คิดว่าวิธีการวาดต้นไม้แบบปกติด้วย "ฐาน" ที่ด้านบนของหน้าและใบไม้ที่ด้านล่าง หากคุณเป็นตัวแทนลำดับชั้นเรียนของคุณด้วยคลาสฐานที่ด้านบนและใบไม้บางส่วนที่อยู่ด้านล่างจากนั้นการชี้ขึ้นและการชี้ลงกลายเป็นตัวอักษร - สิ่งที่เลื่อนหน้าขึ้นจากใบไม้ไปสู่ฐานนั้นจะเป็น แคสต์และบางสิ่งที่เลื่อนหน้าลงจากฐานไปยังใบไม้จะเป็นการเหวี่ยง


2
แต่ต้นไม้ขึ้นไปและลำต้นของพวกมันอยู่บนพื้นดินที่ออกมาจากดิน (นี่คือเหตุผลที่ฉันคิด upcast)

@ acidzombie24: แต่ในหนังสือเกี่ยวกับวิทยาการคอมพิวเตอร์คุณจะพบว่าต้นไม้ถูกวาดตามที่ฉันอธิบายด้วยรากที่ด้านบน
Jerry Coffin

ฉันรู้ แต่ฉันก็แค่ตลก ต้นไม้ (ของจริง) และฐาน (เช่นฐานรากและใต้ฝ่าเท้าของฉัน) เป็นวิธีที่ไม่ดีที่จะคิดถึงมัน :(. +1

5
@ acidzombie24: แค่คิดว่ามันเป็นต้นไม้ในออสเตรเลีย
Martin York
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.