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

Đề tài: Lập trình C++ | Tạo final class (lớp tận cùng) trong C++

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,749

    Mặc định Lập trình C++ | Tạo final class (lớp tận cùng) trong C++

    Tạo final class (lớp tận cùng) trong C++
    Tóm tắc từ bài viết : A non-inheritable class - Zeeshan Amjad
    http://www.codeproject.com/cpp/finalclass.asp


    Trong Java , final class (lớp tận cùng) là một class không có subclass (lớp con), nghĩa là không thể tạo một lớp khác thừa kế từ "lớp tận cùng" nói trên. Làm thế nào để tạo final class trong C++ ? Sau đây là thủ thuật để làm điều đó.
    PHP Code:
     template<typename T>
       class 
    MakeFinal
       
    {
       private:
           ~
    MakeFinal() { }
           
    friend T;
       };

       class 
    FinalClass virtual public MakeFinal<FinalClass>
       {
           
    // ....
       
    }; 


    Nếu chúng ta tạo một subclass của class MakeFinal, C++ compiler sẽ không phàn nàn điều gì cả (ngược lại Java compiler sẽ báo sai ở lúc này). Tuy nhiên khi chúng ta tạo một object từ subclass nói trên compiler sẽ báo sai :
    PHP Code:
    class SubClass: public FinalClass
       
    {
       };

       
    SubClass obj// compiler sẽ báo sai ở đây 


    Code:
    error C2248: 'MakeFinal<class FinalClass>::~MakeFinal<class FinalClass>' : 
    cannot access private member declared in class 'MakeFinal<class FinalClass>'

    Lý do :
    SubClass có một virtual base class là MakeFinal<FinalClass>, do đó SubClass có nhiệm vụ trực tiếp tạo một object MakeFinal<FinalClass> khi bắt đầu và khi kết thức, SubClass cũng có trách nhiệm trực tiếp huỷ đối tượng đó => trực tiếp gọi ~MakeFinal<FinalClass> . Tuy nhiên ~MakeFinal<FinalClass> là private và SubClass không phải là friend của MakeFinal<>, nên compiler mới đưa ra thông báo trên.

    Ngược lại, FinalClass objFinalClass; thì không bị báo sai vì FinalClass là friend của MakeFinal<FinalClass> nên FinalClass có quyền truy cập tới các thành viên của MakeFinal<FinalClass>

    Nguồn từ diendantinhoc.net
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

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

    ha ha
    cách làm này hơi ngược với mình

    template<typename T>
    class MakeFinal
    {
    private:
    MakeFinal() { } //constructor thay vì destructor
    friend T;
    };

Các đề tài tương tự

  1. Windows Final Of My Life - Bản Windows cuối cùng
    Gửi bởi chicken_it_90 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 29-12-2011, 01:21 AM
  2. Có gì mới trong phiên bản WinRAR 4.00 Final
    Gửi bởi chjentha11 trong diễn đàn Software (Phần mềm) | Ebooks
    Trả lời: 0
    Bài viết cuối: 30-09-2011, 04:06 PM
  3. Kỹ thuật C++ gán con trỏ đến hàm trong cùng 1 class như thế nào?
    Gửi bởi kukopuka trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 30-04-2011, 08:18 PM
  4. Cách lấy giá trị biến từ class này sang class khác trong lập trình C#
    Gửi bởi phongk20 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 13-03-2011, 05:19 PM
  5. Sử dụng cùng giá trị Mảng trong các Class khác nhau ???
    Gửi bởi nam_dkn trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 23-02-2009, 11:17 AM

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