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à đủ.
Đâ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
@ 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
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