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

Đề tài: [ Solved ]Cho tôi hỏi về Virtual function

  1. #1
    No Avatar
    petepan86 Khách

    Mặc định [ Solved ]Cho tôi hỏi về Virtual function

    Tôi đọc phần về Virtual function thì không hiểu rõ lắm, có bạn nào giải thích thêm giúp được không, xin cám ơn rất nhiều

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Bạn cần chỉ ra bạn không hiểu rõ chỗ nào thì mọi người mới giúp được chứ! Còn nếu bạn muốn mọi người nói từ đầu thì tôi nghĩ không ai muốn nói đâu. Nếu bạn chỉ rõ ra rằng bạn không hiểu chỗ nào, rất nhiều người sẵn sàng giúp bạn đó.

  3. #3
    No Avatar
    petepan86 Khách

    Sorry vì đã post bài không rõ ràng. Tôi không rõ chức năng của Virtual Function. Mọi người trả lời giúp, cảm ơn rất nhiều

  4. #4
    No Avatar
    noname.cpp Khách

    Đối với kĩ thuật thừa kế ,việc mỗi lớp trong cây thừa kế muốn định nghĩa lại các phương thức từ lớp cha là rất phổ biến.
    Code:
    class Shape
    {
         Point* points;
         public :
               void Draw()
               {
                     cout<<"Shape :: Draw()"<<endl;
               }
    };
    class  Rectangle 
    {
         public :
               void Draw() 
               {
                      cout<<"Rectangle :: Draw()"<<endl;
               }
    };
    Bây giờ nếu khai báo :
    Code:
    Shape*  shape    =   new Rectangle();
    Và gọi :
    Code:
           shape->Draw();//Kết quả in ra là : "Shape :: Draw()"
    Thì hàm Shape :: Draw() sẽ được gọi vì lời gọi hàm được xác định vào thời điểm biên dịch.Trong khi đó ta lại mong muốn hàm Rectangle :: Draw được gọi.
    Khi đó phải cần đến một kĩ thuật là dùng hàm virtual.Khi một hàm được khai báo là hàm virtual ,các lớp con của nó nếu muốn có một phiên bản hàm đó của riêng nó sẽ override hàm ảo này.Và lời gọi đến hàm này sẽ được xác định tại thời điểm chạy(gọi là gán kiểu muộn) dựa vào kiểu của biến đối tượng mà con trỏ trỏ đến chứ không phải kiểu của bản thân con trỏ.

    Vì vậy sửa lại khai báo của hàm Shape :: Draw() như sau :
    Code:
    public : virtual void Draw()
    Khi đó lời gọi
    Code:
    shape->Draw();//Kết quả :"Rectangle :: Draw()"
    Sẽ cho kết quả mong muốn.
    Việc này rất có ích ví dụ như khi ta tiếp tục định nghĩa các lớp khác như Triangle,Circle thừa kế lớp Shape, và khi ta muốn lưu các đối tượng của các lớp khác nhau vào mảng các con trỏ kiểu Shape ,lúc gọi hàm ta không cần quan tâm đến kiểu của đối tượng được trỏ đến ,lời gọi hàm sẽ được tự động xác định khi chạy.
    Đã được chỉnh sửa lần cuối bởi Admin : 07-10-2006 lúc 10:06 PM.

  5. #5
    Ngày gia nhập
    08 2006
    Bài viết
    1

    Hi,All.
    Tôi cũng mới học C. Tôi không biết dòng khai báo "Shape* shape = new Rectangle();" có đúng không?Nhưng khi biên dịch thì báo lỗi" error C2440: 'initializing' : cannot convert from 'class Rectangle *' to 'class Shape *'".Tôi dùng VC6.0. Vậy noname.cpp có thể chỉ rõ hơn được không?

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

    Mặc định [ Solved ]Cho tôi hỏi về Virtual function

    tại vì noname.cpp nhầm 1 chỗ (chắc do sơ ý), sửa lại như thế này
    Code:
    origin:
    class  Rectangle
    change to:
    class  Rectangle : public Shape

  7. #7
    No Avatar
    noname.cpp Khách

    uh đúng rồi ,thiếu phần khai báo thừa kế.Xin lỗi.

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

  1. C++ Tutorial Virtual table trong việc dynamic binding phương thức virtual
    Gửi bởi luc13aka47 trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 19-04-2016, 08:56 PM
  2. Lỗi pure virtual function call -> nguyên nhân là do hàm hủy tự động gọi @@
    Gửi bởi vipzero trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 14
    Bài viết cuối: 16-12-2012, 08:08 AM
  3. Gặp lỗi khi sử dụng Virtual Function
    Gửi bởi alkill trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 11-08-2011, 06:47 PM
  4. [ Solved ]Thừa kế đối với friend function
    Gửi bởi thavali trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 9
    Bài viết cuối: 22-11-2008, 09:50 AM
  5. Function Pointer trong Class, lỗi cannot convert from 'int (__cdecl *)(int)' to 'int (__thiscall Class::*)(int)'
    Gửi bởi DKhanh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 15-12-2007, 04:04 PM

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