Computer >> Máy Tính >  >> Lập trình >> C ++

Dynamic_cast và static_cast trong C ++

static_cast: Điều này được sử dụng để chuyển đổi loại bình thường / bình thường. Đây cũng là bộ ép kiểu chịu trách nhiệm về ép kiểu ngầm định và cũng có thể được gọi một cách rõ ràng. Bạn nên sử dụng nó trong các trường hợp như chuyển đổi float thành int, char thành int, v.v. Điều này có thể ép kiểu các lớp liên quan. Nếu các loại không giống nhau, nó sẽ tạo ra một số lỗi.

Ví dụ

#include<iostream>
using namespace std;
class Base {};
class Derived : public Base {};
class MyClass {};
main(){
   Derived* d = new Derived;
   Base* b = static_cast<Base*>(d); // this line will work properly
   MyClass* x = static_cast<MyClass*>(d); // ERROR will be generated during compilation
}

Đầu ra

[Error] invalid static_cast from type 'Derived*' to type 'MyClass*'

dynamic_cast :Cast này được sử dụng để xử lý đa hình. Bạn chỉ cần sử dụng nó khi truyền tới một lớp dẫn xuất. Điều này chỉ được sử dụng trong kế thừa khi bạn truyền từ lớp cơ sở sang lớp dẫn xuất.

Ví dụ

#include<iostream>
using namespace std;
class MyClass1 {
   public:
      virtual void print()const {
         cout << "This is from MyClass1\n";
      }
};
class MyClass2 {
   public:
      virtual void print()const {
         cout << "This is from MyClass2\n";
      }
};
class MyClass3: public MyClass1, public MyClass2 {
   public:
      void print()const {
         cout << "This is from MyClass3\n";
      }
};
int main(){
   MyClass1* a = new MyClass1;
   MyClass2* b = new MyClass2;
   MyClass3* c = new MyClass3;
   a -> print();
   b -> print();
   c -> print();
   b = dynamic_cast< MyClass2*>(a); //This cast will be failed
   if (b)
      b->print();
   else
      cout << "no MyClass2\n";
   a = c;
   a -> print(); //Printing from MyClass3
   b = dynamic_cast< MyClass2*>(a); //Successfully casting is done
   if (b)
      b -> print();
   else
      cout << "no MyClass2\n";
}

Đầu ra

This is from MyClass1
This is from MyClass2
This is from MyClass3
no MyClass2
This is from MyClass3
This is from MyClass3