Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Sửa lỗi khi thừa kế phương thức virtual

  1. #1
    Ngày gia nhập
    09 2008
    Bài viết
    6

    Mặc định Sửa lỗi khi thừa kế phương thức virtual

    Hi all, em mới học lập trinh hướng đối tượng đang làm bài tập vê kế thừa viết trên vc++6.0, nhưng mà đang gặp một số lỗi mà không biết sửa bác nào biết thì test hộ em với nhé.
    Thanks các bác nhiều.
    Đê của em như sau:
    Xây dựng lớp người, lớp sinhvien va lớp giáo viên kê thừa từ lớp người, kiểm tra xem cuối năm ai được khen thưởng.
    em xay dựng nhu sau:

    Lớp người:
    Code:
    #include <iostream.h>
    #include <string.h>
    #ifndef NGUOI_H
    #define NGUOI_H
    
    class Nguoi{
    protected: 
    char *hoten;
    public:
    	Nguoi(){}
    	Nguoi(char *ht)
    	{
    	/*	ht = new char[50];*/
    	hoten = strdup(ht);
    	}
    	 ~Nguoi(){delete hoten;}
    	virtual int ktkhenthuong() const = 0;
    	virtual void xuat() const = 0;
    	virtual void nhap();
    
    };
    
    
    void Nguoi::nhap()
    {
    	cout<<"Nhap ho ten:";
    	cin.getline(hoten,50);
    }
    #endif
    Lớp SinhVien:
    Code:
    #include <string.h>
    #include "Nguoi.h"
    
    #ifndef SINHVIEN_H
    #define SINHVIEN_H
    
    class SinhVien:public Nguoi
    {
    private:
    float diemtb;
    public:
    	SinhVien(char *ht,float dtb):Nguoi(ht)
    	{
    	diemtb = dtb;
    	}
    	SinhVien(){}
    	
    	virtual int ktkhenthuong() const;
    	virtual void xuat() const;
    	virtual void nhap();
    };
    int SinhVien::ktkhenthuong() const
    {
    return (diemtb>8,0);
    
    }
     void SinhVien::nhap()
    {
    	Nguoi::nhap();
    	cout<<"\nDiem trung binh:";
    	cin>>diemtb;
    }
    void SinhVien::xuat() const
    {
    	cout<<"ho ten sinh vien:"<<hoten;
    }
    #endif
    Lớp GiangVien:
    Code:
    #include <string.h>
    #include "Nguoi.h"
    
    #ifndef GIANGVIEN_H
    #define GIANGVIEN_H
    class GiangVien:public Nguoi
    {
    private:
    int dulieubao;
    public:
    	GiangVien(char *ht, int dlb):Nguoi(ht)
    	{
    	
    		dulieubao = dlb;
    	}
    	GiangVien(){}
    	
    	virtual int ktkhenthuong() const;
    	virtual void xuat() const;
    	virtual void nhap();
    };
    
    int GiangVien::ktkhenthuong() const
    {
    	
    return (dulieubao>5);
    }
    void GiangVien::nhap()
    {
    	Nguoi::nhap();
    	cout<<"\nDuoc dang bao bao nhieu lan:";
    	cin>>dulieubao;
    }
    void GiangVien::xuat() const 
    {
    	cout<<"ho ten giao vien:"<<hoten;
    	
    }
    
    
    #endif
    Chương trinh chính:
    Code:
    #include <iostream.h>
    #include <string.h>
    #include "Nguoi.h"
    #include "SinhVien.h"
    #include "GiangVien.h"
    
    int main()
    {
    	Nguoi *p[100];
    	SinhVien sv;
    	GiangVien gv;
    	int n=0,exit,i;
    	char chon;
    	cout<<"Chuong trinh xuat ra nguoi duoc khen thuong\n";
    	cout<<"Press 1 de thoat\n";
    	cin>>exit;
    	do{
    		cout<<"\nGiao Vien or Giang Vien (s,g)";
    		cin>>chon;
    		if(chon=='s')
    		{
    			sv.nhap();
    			p[n++] = new SinhVien(hoten,dtb);
    		}
    		else if(chon=='g')
    		{
    			gv.nhap();
    			p[n++] = new GiangVien(hoten,dulieubao);
    		}
    	}while(exit!=1);
    	for( i=0;i<n;i++)
    	{
    		p[i]->xuat();
    		cout<<endl;
    		if(p[i]->ktkhenthuong())
    			cout<<"\nDuoc khen thuong";
    	}
    return 0;
    }
    Lối:

    Code:
    Nguoi.cpp
    C:\Program Files\Microsoft Visual Studio\MyProjects\bt_kt1\Nguoi.cpp(23) : error C2065: 'hoten' : undeclared identifier
    C:\Program Files\Microsoft Visual Studio\MyProjects\bt_kt1\Nguoi.cpp(23) : error C2065: 'dtb' : undeclared identifier
    C:\Program Files\Microsoft Visual Studio\MyProjects\bt_kt1\Nguoi.cpp(28) : error C2065: 'dulieubao' : undeclared identifier
    Error executing cl.exe.
    
    bt_kt1.exe - 3 error(s), 0 warning(s)
    Mong các bác dúp em sơm sớm tí nhé, em sắp phải thi rồi
    Đã được chỉnh sửa lần cuối bởi ghost_IT : 30-04-2009 lúc 04:48 PM.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Hàm nhập trong lớp người bạn bỏ virtual đi.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    09 2008
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Hàm nhập trong lớp người bạn bỏ virtual đi.
    Hix, mình cũng đã thử rồi nhưng không được. Bạn nào phat hiện ra lỗi gi dúp mình với. Mình mới học va đang chuẩn bị thi rồi.
    Thanks!

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

    Code:
    p[n++] = new SinhVien(hoten,dtb);
    p[n++] = new GiangVien(hoten,dulieubao);
    hoten, dtb, dulieubao
    mấy cái này có thấy khai báo đâu mà sài
    PHP Code:
    void Nguoi::nhap()
    {
        
    cout<<"Nhap ho ten:";
        
    cin.getline(hoten,50);

    hàm nhập vậy nhập được không??
    Đã được chỉnh sửa lần cuối bởi rua_con : 05-05-2009 lúc 09:51 AM.

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

    Hàm nhap() do thi khong sai dau. Con mấy cái kia thì mình dùng ngay trong lớp của nó luon mà

  6. #6
    Ngày gia nhập
    10 2008
    Bài viết
    178

    Mặc định Sửa lỗi khi thừa kế phương thức virtual

    Code:
    p[n++] = new SinhVien(hoten,dtb);
    p[n++] = new GiangVien(hoten,dulieubao);
    hai cái này cậu viết dưới hàm main mà làm sao chạy được dưới hàm main tớ không thấy hoten, đt, dulieubao khai báo ở đâu cả
    còn hàm nhập đã cấp phát đâu mà nhập

  7. #7
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mình đã sửa lại cho chạy được rồi đó :

    C++ Code:
    1. #include <iostream>
    2. #include <string.h>
    3. #include <conio.h>
    4.  
    5. using namespace std;
    6.  
    7. class Nguoi
    8. {
    9.     protected:
    10.         char *hoten;
    11.  
    12.     public:
    13.         Nguoi()
    14.         {
    15.             hoten = new char [100];
    16.         }
    17.    
    18.         Nguoi(char *ht)
    19.         {
    20.             hoten = strdup(ht);
    21.         }
    22.  
    23.         ~Nguoi()
    24.         {
    25.             delete hoten;
    26.         }
    27.  
    28.         virtual int ktkhenthuong() = 0;
    29.         virtual void xuat() = 0;
    30.         virtual void nhap();
    31. };
    32.  
    33.  
    34. void Nguoi::nhap()
    35. {
    36.     if (cin.gcount() > 0)
    37.         cin.ignore();
    38.     cout<<"Nhap ho ten:";
    39.     cin.getline(hoten,50);
    40. }
    41.  
    42.  
    43. class SinhVien:public Nguoi
    44. {
    45.     private:
    46.         float diemtb;
    47.  
    48.     public:
    49.         SinhVien(char *ht,float dtb):Nguoi(ht)
    50.         {
    51.             diemtb = dtb;
    52.         }
    53.        
    54.         SinhVien()
    55.         {
    56.         }
    57.  
    58.         int ktkhenthuong();
    59.         void xuat();
    60.         void nhap();
    61. };
    62.  
    63. int SinhVien::ktkhenthuong()
    64. {
    65.     return (diemtb > 8.0);
    66. }
    67.  
    68. void SinhVien::nhap()
    69. {
    70.     Nguoi::nhap();
    71.     cout<<"Diem trung binh:";
    72.     cin>>diemtb;
    73. }
    74.  
    75. void SinhVien::xuat()
    76. {
    77.     cout<<"ho ten sinh vien:"<<hoten<<endl;
    78. }
    79.  
    80.  
    81. class GiangVien:public Nguoi
    82. {
    83.     private:
    84.         int dulieubao;
    85.    
    86.     public:
    87.         GiangVien(char *ht, int dlb):Nguoi(ht)
    88.         {
    89.        
    90.             dulieubao = dlb;
    91.         }
    92.  
    93.         GiangVien(){}
    94.    
    95.         int ktkhenthuong();
    96.         void xuat();
    97.         void nhap();
    98. };
    99.  
    100. int GiangVien::ktkhenthuong()
    101. {  
    102.     return (dulieubao > 5);
    103. }
    104.  
    105. void GiangVien::nhap()
    106. {
    107.     Nguoi::nhap();
    108.     cout<<"Duoc dang bao bao nhieu lan:";
    109.     cin>>dulieubao;
    110. }
    111.  
    112. void GiangVien::xuat()
    113. {
    114.     cout<<"ho ten giao vien:"<<hoten<<endl;
    115. }
    116.  
    117.  
    118. void main()
    119. {
    120.     Nguoi *nguoi1 = new SinhVien();
    121.     Nguoi *nguoi2 = new GiangVien();
    122.    
    123.     nguoi1->nhap();
    124.     nguoi1->xuat();
    125.  
    126.     nguoi2->nhap();
    127.     nguoi2->xuat();
    128.  
    129.     getch();
    130.     delete nguoi1;
    131.     delete nguoi2;
    132. }
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 05-05-2009 lúc 11:45 AM.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  8. #8
    Ngày gia nhập
    10 2008
    Bài viết
    178

    bác meo sửa cho cậu rùi đó hàm nhập bác meo chưa sửa cậu sửa thành
    PHP Code:
    void Nguoi::nhap()
    {
        
    cout<<"Nhap ho ten:";
        
    hoten = new char[50];////cấp phát 50 phần tử
        
    cin.getline(hoten,50);


  9. #9
    Ngày gia nhập
    03 2008
    Bài viết
    25

    Mấy lớp kế thừa từ lớp người, ông bỏ virtual hết đi, chỉ khai báo là sử dụng lại hàm đó và cài đặt nó lại thôi. Ví dụ trong lớp Sinh Viên
    PHP Code:
    virtual int ktkhenthuong() const = 0;
    virtual void xuat() const = 0;
    virtual void nhap(); 
    Thay bằng
    PHP Code:
    int ktkhenthuong() const = 0;
    void xuat() const = 0;
    void nhap(); 
    Mấy lớp khác kế thừa từ lớp Nguoi ta cũng làm thế.
    Đã được chỉnh sửa lần cuối bởi hunter_hikaru : 05-05-2009 lúc 11:56 AM.

  10. #10
    Ngày gia nhập
    10 2008
    Bài viết
    178

    Trích dẫn Nguyên bản được gửi bởi hunter_hikaru Xem bài viết
    Mấy lớp kế thừa từ lớp người, ông bỏ virtual hết đi, chỉ khai báo là sử dụng lại hàm đó và cài đặt nó lại thôi. Ví dụ trong lớp Sinh Viên
    PHP Code:
    virtual int ktkhenthuong() const = 0;
    virtual void xuat() const = 0;
    virtual void nhap(); 
    Thay bằng
    PHP Code:
    int ktkhenthuong() const = 0;
    void xuat() const = 0;
    void nhap(); 
    Mấy lớp khác kế thừa từ lớp Nguoi ta cũng làm thế.
    để thì có sao dâu bác chả liên quan j

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. 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. Sự khác biệt giữa new, virtual và override ?
    Gửi bởi NT_OnlyLove trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 03-09-2009, 10:48 PM
  5. Increase your Virtual RAM
    Gửi bởi Xcross87 trong diễn đàn Thắc mắc chung
    Trả lời: 5
    Bài viết cuối: 21-06-2007, 09:36 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