2015-10-13 14 views
7

Giả sử tôi có một cơ sở và lớp trẻ và một chút đa kế thừa:Implicit đúc - mà dàn diễn viên được sử dụng

class Child : public Base, public AnotherBase 
{ 
}; 

và một hàm foo(Base* b). Tôi cũng đã khởi tạo một số Child* c. Sau đó tôi gọi foo(c).

Trình biên dịch tạo một diễn viên ngầm ở đây. Nhưng nó có phải là một dàn diễn viên kiểu C, static_cast<Base*> hay cái gì khác?

+1

Trình biên dịch C++ thực hiện [* chuyển đổi ngầm * * (http://en.cppreference.com/w/cpp/language/implicit_cast), và liên kết đó sẽ cho bạn biết tất cả những gì bạn cần biết (mặc dù rất khó để đọc và hiểu nhanh). –

+0

Vì vậy, nếu sếp của tôi đã viết 'foo (static_cast (c))' tôi có thể xóa 'static_cast' một cách an toàn không? –

+0

Có, một con trỏ đến một lớp con luôn luôn chuyển đổi hoàn toàn thành một con trỏ đến một lớp cơ sở. –

Trả lời

5

static_cast và phôi kiểu C là cách của lập trình viên yêu cầu chuyển đổi loại một cách rõ ràng. Ví dụ của bạn là chuyển đổi tiềm ẩn chuẩn được mô tả riêng biệt thay vì theo các chuyển đổi rõ ràng.

dụ của bạn được biết đến như một sự chuyển đổi -to có nguồn gốc-base và được định nghĩa trong [conv.ptr]/2 trong tiêu chuẩn:

N3337:Một prvalue kiểu “con trỏ đến cvD”, nơi D là loại lớp, có thể được chuyển đổi thành giá trị bằng loại "con trỏ đến cvB", trong đó B là lớp cơ sở là D. Nếu B là lớp cơ sở không thể truy cập hoặc không rõ ràng của D, một chương trình yêu cầu chuyển đổi này không đúng định dạng. Kết quả của việc chuyển đổi là một con trỏ tới lớp con cơ sở của đối tượng lớp dẫn xuất. Giá trị con trỏ null được chuyển thành giá trị con trỏ null của kiểu đích.

Nói cách khác, một D* luôn là mặc nhiên chuyển đổi thành một B* với cùng constvolitile trình độ.

Các vấn đề liên quan