Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Toán tử gán với đa hình trong lập trình C++

  1. #1
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Toán tử gán với đa hình trong lập trình C++

    Đây là 1 mẹo nhỏ để quá tải lại toán tử gán dùng chung, mà không những thế nó còn hack được derived class luôn . Ví dụ chúng ta có 1 loạt sản phẩm của các hệ điều hành Window, Unix, Linux. Khi khác hàng mua hàng, họ cần mua 1 loại sản phẩm nào đó ( 1 class derived ) mà chúng ta đã hết hàng thì chúng ta có thể dùng toán tử gán để cho nó biến thành ( clone() ) 1 lớp khác. Cái này vô tình giúp 1 bạn bên diendantinhoc, nghĩ ra thấy nó cũng hay hay . Chưa biết ứng dụng thì sẽ thế nào, cái này phải suy nghĩ thêm T_T. Vì chưa thấy ai dùng kiểu này đó mà T_T. Có lẽ nó chắc là poor-design thật vì gán 2 class khác nhau cũng hơi phi lý, nhưng thôi mấy bạn nào ham vui thì hì hì .
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <typeinfo.h>
    4. #include <vector>
    5.  
    6. class OS{
    7. protected :
    8.     std::string label;
    9. public :
    10.     OS(std::string label):label(label){}
    11.     virtual OS& operator = (const OS& os) {
    12.         label = os.label;
    13.         return *this;
    14.     }
    15.     virtual void show(std::ostream &) const = 0;
    16. };
    17.  
    18. class Window : public OS {
    19. public :
    20.     Window(std::string wLabel):OS(wLabel){}
    21.     virtual Window& operator = (OS* ptr)
    22.     {
    23.         if(dynamic_cast<Window*>(ptr) != 0)
    24.             return *this;
    25.         else{
    26.             dynamic_cast<OS* >(ptr);
    27.             return *this;
    28.         }
    29.     }
    30.     virtual void show(std::ostream &os) const{
    31.         os << "OS : " << label << '\n';
    32.     }
    33. };
    34.  
    35. class Linux : public OS {
    36. public :
    37.     Linux(std::string wLabel):OS(wLabel){}
    38.     virtual Linux& operator = (OS* ptr)
    39.     {
    40.         if(dynamic_cast<Linux*>(ptr) != 0)
    41.             return *this;
    42.         else{
    43.             dynamic_cast<OS* >(ptr);
    44.             return *this;
    45.         }
    46.     }
    47.     virtual void show(std::ostream &os) const{
    48.         os << "OS : " << label << '\n';
    49.     }
    50. };
    51.  
    52. void showAll(std::vector<OS* > &operating_system)
    53. {
    54.     for(std::vector<OS* >::const_iterator iss = operating_system.begin();
    55.         iss != operating_system.end(); ++iss)
    56.     {
    57.         (*iss)->show(std::cout);
    58.     }
    59. }
    60.  
    61. int main()
    62. {
    63.     std::vector<OS* > operating_system;
    64.     operating_system.push_back(new Window("Vista"));
    65.     operating_system.push_back(new Window("XP"));
    66.     operating_system.push_back(new Window("Window98"));
    67.     operating_system.push_back(new Linux("Unbutu"));
    68.     operating_system.push_back(new Linux("Fedora"));
    69.     operating_system.push_back(new Linux("RedHat"));
    70.    
    71.     showAll(operating_system);
    72.     std::cout << "Hack product !!!^_^ \n\n";
    73.  
    74.     //Wow Vista đã biến thành RedHat, what the hack T_T!
    75.     operating_system[0] = operating_system[5];
    76.     showAll(operating_system);
    77.  
    78.     std::cout << '\n';
    79.     for(int x = 0; x < operating_system.size(); ++x){
    80.         std::cout << "Deleting : \n " << typeid(*operating_system[x]).name() << '\n';
    81.     }
    82.  
    83.     return 0;
    84. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 02-03-2008 lúc 03:01 AM.

  2. #2
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    Cái này là dùng trick cho C++, lợi dụng con trỏ để thực hiện dynamic_cast, khá nguy hiểm nếu có nhầm lẫn khi coding

    Để bảo đảm hơn, cậu phải xem qua C#, object có thể explicit cast thành mọi kiểu khác, nếu không được nó sẽ throw 1 exception. Để làm được điều đó, mọi class trong C# đều có 1 attribute là class GUID, cậu có thể bắt chước C# để làm trick trên an toàn hơn

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cái này là dùng trick cho C++, lợi dụng con trỏ để thực hiện dynamic_cast, khá nguy hiểm nếu có nhầm lẫn khi coding

    Để bảo đảm hơn, cậu phải xem qua C#, object có thể explicit cast thành mọi kiểu khác, nếu không được nó sẽ throw 1 exception. Để làm được điều đó, mọi class trong C# đều có 1 attribute là class GUID, cậu có thể bắt chước C# để làm trick trên an toàn hơn
    Dạ em cám ơn anh T_T. Chắc em sẽ chưa học C#, cái này chỉ xài vui thôi chứ xài nhiều quá thì code is a big messy T_T! Nếu có pointer thì chắc phải dùng auto_ptr.

  4. #4
    Ngày gia nhập
    08 2008
    Bài viết
    15

    nếu em muốn xây dựng hàm quá tải toán tử NEW và DELETE thì phải làm sao ạ, mọi người chỉ dùng em với.

  5. #5
    Ngày gia nhập
    09 2007
    Bài viết
    724

    nếu em muốn xây dựng hàm quá tải toán tử NEW và DELETE thì phải làm sao ạ, mọi người chỉ dùng em với.
    Trong C++ thì nếu muốn quá tải các toán tử new thì bạn viết lại các hàm constructor.
    còn muốn quá tải toán tử delete thì viết lại hàm destructor.

    hàm constructor nó sẽ được tự động gọi khi đối tượng bắt đầu nhiệm vụ của nó.
    còn hàm destructor nó sẽ được gọi khi một đối tượng hết việc của nó(" đối tượng đó đi bán củi khô" ).

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn