6.2.6 Tương Thích Kiểu – ép Kiểu động | CppDeveloper
Có thể bạn quan tâm
Có một vấn đề ở đây là static_cast rất dễ bị lạm dụng và sử dụng sai cách. Nếu bạn sử dụng nó một cách quá vô tư và hồn nhiên thì bạn có thể gặp rắc rối.
Hãy xem ví dụ này →
C++ #include <iostream> #include <string> using namespace std; class Pet { protected: string Name; public: Pet(string n) { Name = n; } void Run(void) { cout << Name << ": I'm running" << endl; } }; class Dog : public Pet { public: Dog(string n) : Pet(n) {}; void MakeSound(void) { cout << Name << ": Woof! Woof!" << endl; } }; class Cat : public Pet { public: Cat(string n) : Pet(n) {}; void MakeSound(void) { cout << Name << ": Meow! Meow!" << endl; } }; int main(void) { Pet *a_pet1 = new Cat("Tom"); Pet *a_pet2 = new Dog("Spike"); a_pet2 -> Run(); static_cast<Cat *>(a_pet2) -> MakeSound(); a_pet1 -> Run(); static_cast<Dog *>(a_pet1) -> MakeSound(); return 0; }| 12345678910111213141516171819202122232425262728293031323334 | #include <iostream>#include <string> usingnamespacestd; classPet{protected:stringName;public:Pet(stringn){Name=n;}voidRun(void){cout<<Name<<": I'm running"<<endl;}}; classDog:publicPet{public:Dog(stringn):Pet(n){};voidMakeSound(void){cout<<Name<<": Woof! Woof!"<<endl;}}; classCat:publicPet{public:Cat(stringn):Pet(n){};voidMakeSound(void){cout<<Name<<": Meow! Meow!"<<endl;}}; intmain(void){Pet*a_pet1=newCat("Tom");Pet*a_pet2=newDog("Spike");a_pet2->Run();static_cast<Cat*>(a_pet2)->MakeSound();a_pet1->Run();static_cast<Dog*>(a_pet1)->MakeSound();return0;} |
Ví dụ này cố gắng để đối xử với một con mèo như một con chó và ngược lại. Kết quả thật thảm khốc – chương trình sẽ tạo ra kết quả sau:
C++ Spike: I'm running Spike: Meow! Meow! Tom: I'm running Tom: Woof! Woof!| 1234 | Spike:I'm runningSpike: Meow! Meow!Tom: I'mrunningTom:Woof!Woof! |
Con chó (tên là Spike thì kêu Meow! Meow!) còn con mèo (tên là Tom thì sủa Woof! Woof!). Đó là một cơn ác mộng.
Kết quả này là do trình biên dịch không thể kiểm tra nếu con trỏ (đã được chuyển đổi kiểu – ép kiểu) tương thích với đối tượng mà nó trỏ đến. Trình biên dịch hiểu rằng con trỏ là hợp lệ và nó tin rằng chúng ta hiểu rõ những gì chúng ta đang làm.
Việc kiểm tra tính hợp lệ của con trỏ một cách toàn diện chỉ có thể được thực hiện khi chương trình đang được chạy (runtime). Ngôn ngữ C++ có một toán tử ép kiểu thứ hai được thiết kế đặc biệt cho trường hợp này. Đó là dynamic_cast. Tên của nó đã nói lên rằng việc ép kiểu được thực hiện một cách linh động, phục thuộc vào hiện trạng của tất cả các đối tượng liên quan. Điều này có nghĩa là việc ép kiểu có thể thành công hoặc không thành công. OK, chúng ta sẽ sớm quay lại nói rõ hơn về vấn đề này.
Từ khóa » ép Kiểu Class Trong C++
-
Ép Kiểu Trong C++ - Techacademy
-
Chuyển Kiểu Của đối Tượng, Nạp Chồng Toán Tử
Trong C++ -
Ép Kiểu Trong C++ - Học Lập Trình C++ Online - Viettuts
-
Ép Kiểu Tường Minh Trong C++ (Explicit Type Conversion In C++)
-
Nạp Chồng Toán Tử Trong C++ | TopDev
-
5 Toán Tử ép Kiểu Trong C++ | VnCoding
-
Toán Tử ép Kiểu (casting) Trong C++
-
Ép Kiểu Con Trỏ Trỏ đến Class - Cộng đồng C Việt
-
Java Bài 31: Ép Kiểu Trong OOP - YellowCode.Books
-
Lập Trình C++ Chuyển đổi Dữ Liệu Trong C++ | Ép Kiểu Dữ Liệu.
-
[Lập Trình C++ Cơ Bản] Bài 6: Hàm Trong C++ - Viblo
-
Lớp Và Đối Tượng Trong Lập Trình C++
-
Phương Pháp ép Kiểu Dữ Liệu Trong C++
-
Ép Kiểu Dữ Liệu Trong Java