2015-12-14 32 views
11

Loại diễn viên nào diễn ra ở đây (trong B::get())?Lớp dẫn xuất từ ​​Cast đến cơ sở

class A { 
public: 
    A() : a(0) {} 
    int a; 
}; 

class B : public A { 
public: 
    A* get() { 
     return this; //is this C-style cast? 
    } 
}; 

int main() 
{ 
    B b; 
    cout << b.get()->a << "\n"; 

    system("pause"); 
    return 0; 
} 

Tôi đã thấy loại mã này trong API nổi tiếng. Có thực hành tốt hơn để thực hiện static_cast<A*>(this); không?

+8

Không có tính năng truyền nào cả, chỉ là chuyển đổi tiềm ẩn. Một diễn viên là một chuyển đổi rõ ràng. – molbdnilo

Trả lời

9

Đây là chuyển đổi con trỏ từ gốc sang cơ sở tiêu chuẩn. Các quy tắc là con trỏ đến D với một số bằng cấp số const/volatile có thể được chuyển thành con trỏ thành B với cùng một vòng loại nếu B là lớp cơ sở là D.

Chuyển đổi chuẩn là chuyển đổi tiềm ẩn với ý nghĩa tích hợp và là các khái niệm riêng biệt cho những thứ như static_cast hoặc phôi kiểu C.

Nói chung tốt nhất nên dựa vào chuyển đổi tiềm ẩn khi bạn có thể. Chuyển đổi rõ ràng làm tăng thêm tiếng ồn của mã và có thể ẩn một số lỗi bảo trì.

+0

Nghiêm ngặt, "có thể được chuyển thành con trỏ thành' B' với cùng một * hoặc nhiều hơn * vòng loại " –

+2

Tôi đề nghị trả lời cụ thể câu hỏi của anh ấy:" Không, thực hành tốt hơn là sử dụng 'static_cast' - trên thực tế, nó là thực hành tồi tệ hơn. Luôn tránh phôi nếu bạn không cần chúng. " –

+0

@MartinBonner Không đồng ý! Implicit phôi là nguồn gốc của tất cả các loại lỗi wacky. Đôi khi tôi muốn C + + thậm chí không có họ ở tất cả ... Không có gì sai với việc rõ ràng. – Barry

3

Chuyển đổi ẩn thành tổ tiên. Chuyển đổi ngầm định nói chung là an toàn và chúng không thể thực hiện các công cụ static_cast không thể thực hiện được. Chúng thậm chí còn bị hạn chế hơn nữa: bạn có thể thực hiện một downcast không được kiểm soát với static_cast, nhưng không phải với chuyển đổi ngầm.

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