Mình không hiểu ý dòng 2, con trỏ và tham chiếu cơ bản mình cũng học lâu lắm rồi, nhưng chưa bao giờ được dậy viết kiểu này.
Phía trên có lớp Cattle , và 2 lớp kế thừa Cow và Bull
Cattle cattle;
Cow* a = (Cow*)&cattle;
Mình không hiểu ý dòng 2, con trỏ và tham chiếu cơ bản mình cũng học lâu lắm rồi, nhưng chưa bao giờ được dậy viết kiểu này.
Phía trên có lớp Cattle , và 2 lớp kế thừa Cow và Bull
Cattle cattle;
Cow* a = (Cow*)&cattle;
từ Cattle sao có thể ép kiểu thành Cow được, chỉ có Cow thành Cattle thôi :V
Cow cow;
Cattle* a1 = static_cast<Cattle*>(&cow);
// hoặc
Cattle& a2 = static_cast<Cattle&>(cow);
đại loại như kiểu chỉ vô con bò mình có thể nói nó là gia súc ấy :V Còn ngược lại như cái code trên chỉ vô con gia súc nói nó là con bò thì đâu có đúng, lỡ con gia súc ấy thật ra là con dê thì sao :V Muốn biết chính xác có thể gọi con gia súc là con bò hay ko thì phải xài dynamic_cast
. Từ trỏ tới con bò thành trỏ tới gia súc thì static_cast
là đủ.
Cow* b1 = dynamic_cast<Cow*>(a1);
if (b1 != nullptr) {
// a1 trỏ tới Cow, có thể sử dụng b1
} else {
// a1 ko trỏ tới Cow
}
à ko cần nhất thiết phải là con trỏ cấp phát động mới cast thành lớp cha/lớp con được. Con trỏ tới object bất kì nằm ở stack hay heap đều được nha :V
Cow* a = new Cow;
Cattle* b = a; // được, static_cast<Cattle*> ngầm định
Cow c;
b = &c; // cũng được, ko nhất thiết phải cấp phát động