Upcasting / downcasting là gì?


16

Khi tìm hiểu về đa hình, bạn thường thấy một cái gì đó như thế này

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

Upcasting hoặc downcasting là gì? Là (Derived*)base_ptr;một u ám hay downcast?

Tôi gọi nó là u ám vì bạn đang đi từ căn cứ vào một cái gì đó cụ thể hơn. Những người khác nói với tôi rằng đó là một sự thất vọng bởi vì bạn đang đi xuống một hệ thống phân cấp thành một cái gì đó cụ thể với đỉnh là gốc. Nhưng những người khác dường như gọi nó là những gì tôi gọi nó.

Khi chuyển đổi một ptr cơ sở sang một ptr dẫn xuất, nó được gọi là upcasting hay downcasting? và nếu ai đó có thể liên kết đến một nguồn chính thức hoặc giải thích lý do tại sao nó được gọi là tuyệt vời hơn.



3
Nó không phải là một bản sao. Câu hỏi này hỏi nó là gì, người khác hỏi ai đã nghĩ ra cái tên đó.
Robert Harvey

1
@RobertHarvey "và nếu ai đó có thể liên kết đến một nguồn chính thức hoặc giải thích lý do tại sao nó được gọi là tuyệt vời hơn." , nhưng đồng ý, đó có thể được coi là một phần của câu hỏi.
Steven Jeuris

coi chừng ảo đó trong lớp Derogen. Bạn không muốn viết điều đó trừ khi bạn lấy được lớp Derogen thêm một lần nữa. void fn () {...} là đủ.
appoll

JustaPro: thêm virtuallà không cần thiết nhưng không "làm tổn thương". Bạn có thể giải thích lý do tại sao bạn nghĩ rằng nó hoàn toàn không nên được sử dụng trong bối cảnh đó không?
Nik Bougalis

Câu trả lời:


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

Đó là một điều tồi tệ: xem bài viết của Wikipedia về nó.

Trong lập trình hướng đối tượng , downcasting hoặc sàng lọc kiểu là hành động truyền tham chiếu của một lớp cơ sở đến một trong các lớp dẫn xuất của nó.

Trong nhiều ngôn ngữ lập trình, có thể kiểm tra thông qua RTTI xem loại đối tượng được tham chiếu có thực sự là loại được truyền tới hay loại dẫn xuất của nó hay không, và do đó không phát sinh lỗi nếu không phải là trường hợp đó.

Nói cách khác, khi một biến của lớp cơ sở (lớp cha ) có giá trị của lớp dẫn xuất ( lớp con ), thì việc downcasting là có thể ...


9

Trong hầu hết các ngôn ngữ (theo như tôi biết), việc khái quát hóa phôi được thực hiện tự động. Vì vậy, thông thường nếu bạn nói về một dàn diễn viên trong một hệ thống phân cấp, bạn đang đề cập đến một diễn viên chuyên biệt. IMHO hầu hết mọi người với mong muốn tách hai loại gọi là cast cast cast chuyên vì họ nghĩ hệ thống phân cấp thừa kế là một cái cây. Và trong khoa học máy tính, cái gốc được hình dung là đứng đầu. Lý do đằng sau điều này là một quy ước, hoặc, có lẽ là mối hận thù sâu xa đối với các nhà sinh học trong số các nhà khoa học máy tính. (Tất cả các ý định chơi chữ.)

EDIT: Có thể đó là một sự thù hận bắt nguồn từ đầu.


LOL phải +1 :).

2

Hãy nghĩ về cách bình thường để vẽ một cái cây với "cơ sở" ở đầu trang và các lá ở phía dưới. Nếu bạn đại diện cho hệ thống phân cấp lớp của mình theo cách này, với lớp cơ sở ở trên cùng và các lá ở đâu đó bên dưới, thì việc truyền lên và truyền xuống trở thành nghĩa đen - thứ gì đó di chuyển lên trang từ một chiếc lá về phía cơ sở là một - diễn viên và một cái gì đó di chuyển xuống trang từ cơ sở về phía một chiếc lá là một diễn viên xuống.


2
Nhưng cây đi lên và thân cây của chúng ở trên mặt đất nhô ra khỏi đất. (Đây là lý do tại sao tôi tiếp tục suy nghĩ u ám)

@ acidzombie24: Nhưng trong các cuốn sách về khoa học máy tính, bạn sẽ thấy rằng cây thường được vẽ như tôi đã mô tả, với phần gốc ở trên cùng.
Jerry Coffin

Tôi biết nhưng tôi chỉ buồn cười. Cây (cây thật) và chân đế (như móng và dưới chân tôi) là những cách tồi tệ như vậy để nghĩ về nó :(. +1

5
@ acidzombie24: Chỉ cần nghĩ về chúng như cây ở Úc.
Martin York
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.