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

Đề tài: Gặp lỗi khi sử dụng Virtual Function

  1. #1
    Ngày gia nhập
    12 2009
    Bài viết
    28

    Mặc định Gặp lỗi khi sử dụng Virtual Function

    Mình có code như sau:
    C++ Code:
    1. #include <iostream>
    2. #include <conio.h>
    3. #include <vector>
    4.  
    5. using namespace std;
    6.  
    7. class DICHVU
    8. {
    9. protected:
    10.     int tiendv;
    11.     int dongia;
    12. public:
    13.     DICHVU() { tiendv = 0; dongia = 0; }
    14.     DICHVU(int _dongia) { dongia = _dongia;}
    15.     int getTienDV() { return tiendv; }
    16.     virtual void inDV() { cout<<"\nClass DICHVU";} //Virtual Func
    17. };
    18.  
    19. class THUE_XE : public DICHVU
    20. {
    21.     int gio_thue;
    22. public:
    23.     THUE_XE() : DICHVU(){ gio_thue = 0; }
    24.     THUE_XE(int _gio_thue, int _dongia) : DICHVU(_dongia)
    25.     {
    26.         gio_thue = _gio_thue;
    27.         tiendv = gio_thue * dongia;
    28.         if (gio_thue > 7)
    29.             tiendv = tiendv * 0.9;
    30.     }
    31.     void inDV()
    32.     {
    33.         cout<<"\nSo gio thue: "<<gio_thue<<"\nDon gia: "<<dongia<<"\nSo tien: "<<tiendv;
    34.     }
    35. };
    36.  
    37. void main()
    38. {
    39.     vector<DICHVU> ds;
    40.     DICHVU* temp = new THUE_XE(12, 12);
    41.     ds.push_back(*temp);
    42.     vector<DICHVU>::iterator i = ds.begin();
    43.     (*i).inDV(); // Chạy sai chổ này
    44.  
    45.     ds[0].inDV(); // Dùng vậy thay cho iterator đc ko?
    46.  
    47.     // Vậy thì chạy đúng
    48.     DICHVU* temp = new THUE_XE(12, 12);
    49.     temp->inDV();
    50.     //
    51.     _getch();
    52. }

    Tại sao khi gọi hàm void inDV() thì hàm DICHVU::inDV() lại chạy?

  2. #2
    Ngày gia nhập
    04 2011
    Nơi ở
    Heaven
    Bài viết
    90

    Trích dẫn Nguyên bản được gửi bởi alkill Xem bài viết
    Mình có code như sau:
    C++ Code:
    1. #include <iostream>
    2. #include <conio.h>
    3. #include <vector>
    4.  
    5. using namespace std;
    6.  
    7. class DICHVU
    8. {
    9. protected:
    10.     int tiendv;
    11.     int dongia;
    12. public:
    13.     DICHVU() { tiendv = 0; dongia = 0; }
    14.     DICHVU(int _dongia) { dongia = _dongia;}
    15.     int getTienDV() { return tiendv; }
    16.     virtual void inDV() { cout<<"\nClass DICHVU";} //Virtual Func
    17. };
    18.  
    19. class THUE_XE : public DICHVU
    20. {
    21.     int gio_thue;
    22. public:
    23.     THUE_XE() : DICHVU(){ gio_thue = 0; }
    24.     THUE_XE(int _gio_thue, int _dongia) : DICHVU(_dongia)
    25.     {
    26.         gio_thue = _gio_thue;
    27.         tiendv = gio_thue * dongia;
    28.         if (gio_thue > 7)
    29.             tiendv = tiendv * 0.9;
    30.     }
    31.     void inDV()//sai chỗ này
    32.     {
    33.         cout<<"\nSo gio thue: "<<gio_thue<<"\nDon gia: "<<dongia<<"\nSo tien: "<<tiendv;
    34.     }
    35. };
    36.  
    37. void main()
    38. {
    39.     vector<DICHVU> ds;
    40.     DICHVU* temp = new THUE_XE(12, 12);
    41.     ds.push_back(*temp);
    42.     vector<DICHVU>::iterator i = ds.begin();
    43.     (*i).inDV(); // Chạy sai chổ này
    44.  
    45.     ds[0].inDV(); // Dùng vậy thay cho iterator đc ko?
    46.  
    47.     // Vậy thì chạy đúng
    48.     DICHVU* temp = new THUE_XE(12, 12);
    49.     temp->inDV();
    50.     //
    51.     _getch();
    52. }

    Tại sao khi gọi hàm void inDV() thì hàm DICHVU::inDV() lại chạy?
    phải khai báo vector<DICHVU*> ds;vector<DICHVU*>::iterator i = ds.begin();
    ds.push_back(temp);
    ds[0]->inDV();
    nói chung sửa lại những gì liên quan
    Đã được chỉnh sửa lần cuối bởi stupid_genius : 11-08-2011 lúc 01:21 AM.
    I'll come back

  3. #3
    Ngày gia nhập
    11 2010
    Bài viết
    41

    Cơ chế đa hình chỉ có tác dụng với con trỏ và tham chiếu. virtual là cơ chế hỗ trợ đa hình của c++ ==> dùng con trỏ, hoặc tham chiếu!
    i dont care who are u, where yr from, what u did , as long as u love me

  4. #4
    Ngày gia nhập
    12 2009
    Bài viết
    28

    Cám ơn hai bạn. Mình sửa đc rồ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. Bài tập C++ Inheritance - virtual/pure virtual
    Gửi bởi jonathan_nguyen trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 09-02-2013, 10:53 AM
  3. 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
  4. Viết function để test một function khác như thế nào?
    Gửi bởi c_is_master trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 05-05-2012, 02:55 AM
  5. [ Solved ]Cho tôi hỏi về Virtual function
    Gửi bởi petepan86 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 09-10-2006, 11:41 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