2015-10-28 17 views
5

Hãy nói rằng tôi có ba lớp: A (người mẹ, trừu tượng), và B và C, những đứa trẻ của A.chuyển đổi ngầm vs static_cast khi upcasting

Vì vậy, B và C kế thừa từ A (thừa kế công cộng) . Tôi có một danh sách các con trỏ đến A, mà tôi có các con trỏ của B hoặc C.

Câu hỏi là: đó là kiểu ưa thích khi thực hiện truyền/chuyển đổi?

class A {}; 
class B : public A {}; 
class C : public A {}; 

B* objB = new B(); 
C* objC = new C(); 

std::list<A*> myList; 
// Option A: static cast conversion 
myList.push_back(static_cast<A*> (objB)); 
myList.push_back(static_cast<A*> (objC)); 

// Option B: implicit conversion 
myList.push_back(objB); 
myList.push_back(objC); 

// Option C: C-style conversion (I understand that this is evil and must be avoided) 
myList.push_back((A*) objB); 
myList.push_back((A*) objC); 

Vì vậy, xét về độ rõ ràng (kiểu mã) và về mặt an toàn, cái nào tốt hơn? Tôi hiểu rằng static_cast dễ tìm kiếm hơn, nhưng trong trường hợp này, một chuyển đổi tiềm ẩn là đủ.

Trả lời

7

Bạn không phải static_cast đến lớp cơ sở, static_cast là đi theo hướng khác. Vì vậy, đây là tốt

myList.push_back(objB); 
myList.push_back(objC); 

Thời gian bạn sẽ phải static_cast là để làm một cái gì đó đúc một A* đến một lớp học có nguồn gốc B*

B* some_obj = static_cast<B*>(myList.front()); 
+0

Đây là câu trả lời tôi cần. Vì vậy, không có static_cast khi upcasting, nhưng có khi downcasting. Cảm ơn bạn! (và một câu trả lời rất nhanh!) – fern17

+1

@ fern17 Ngoài ra, lưu ý rằng khi downcasting, bạn có thể không phải luôn luôn biết nếu đó là một B hoặc C. Đó là những gì 'dynamic_cast' là cho. – JorenHeit

+0

Vâng, tôi biết, cảm ơn bạn đã làm cho nó rõ ràng (cho tương lai tôi, những người sẽ trở lại câu hỏi này) – fern17

0

Tôi muốn mở rộng trên câu trả lời cung cấp đã có một giải pháp rất chung chung.

Không bao giờ rõ ràng truyền nội dung mà trình biên dịch sẽ ẩn hoàn toàn cho bạn.

Chúng tôi thậm chí có thể khái quát này hơn nữa để:

Con người làm cho những sai lầm. Không bao giờ làm rõ những gì trình biên dịch đã làm cho bạn.

... mặc dù điều đó có thể gây tranh cãi nhiều hơn một chút trong một số trường hợp ngoại lệ rất tối nghĩa. Câu trước phải luôn đúng.

Để truyền một cách rõ ràng là chỉ vi phạm nguyên tắc DRY và quan trọng hơn là mời lỗi và sự nhầm lẫn của con người trong tương lai.

Vì vậy, hãy tránh truyền rõ ràng mọi thứ không yêu cầu. Rõ ràng phôi là một vũ khí: phô trương chúng không cần thiết quá thường xuyên và ai đó bị ràng buộc để bị tổn thương.

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