Thắc mắc về con trỏ và tham chiếu

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
6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?