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ố 16 kết quả

Đề tài: Nhờ giải thích về Lớp cơ sở ảo

  1. #1
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Mặc định Nhờ giải thích về Lớp cơ sở ảo

    Nhờ mọi người giải thích giùm mình về lớp cơ sở ảo được ko ?
    Đây là bài tập của thầy ra
    Code:
    Bài 3:
    Cho một lớp cơ sở ảo như sau:
    
    class BaseSV {
    protected:
    	string ten ;
    	int diem;	
    public:
    	void setData(string t, int d) {
    	ten = t; diem = d ;
    }
    	void getData(string &t, int &d) {
    		t = ten; d = diem;
    }
    	virtual show() = 0 ;
    }
    Hãy xây dựng 2 lớp thừa kế từ lớp BaseSV:
    a)	SinhVienIT ; // sinh viên khoa Công Nghệ Thông tin, hãy tự thêm vào các thông tin cần thiết, viết rõ hàm show.
    b)	SinhVienNN; // sinh viên ngoại ngữ, yêu cầu như trên
    Hàm main(): viết một số lệnh để minh họa việc dùng các lớp trên
    Mình làm thế này ko biết có đúng với yêu cầu liên quan đến lớp cơ sở ảo ko nữa
    Code:
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    class BaseSV
    {
    protected:
    	string ten ;
    	int diem;	
    public:
    	void setData(string t, int d) 
    	{
    		ten = t; diem = d ;
    	}
    	void getData(string &t, int &d) 
    	{
    		t = ten; d = diem;
    	}
    	virtual void show() = 0 ;
    };
    
    class SinhVienIT : public BaseSV
    {
    	protected:
    		string lop,maSV;
    	public:
    		void setLop(string lop){this->lop=lop;};
    		void setMaSV(string maSV){this->maSV=maSV;};		
    		string getLop(){return lop;};	
    		string getMaSV(){return maSV;};
    		void show();
    };
    
    class SinhVienNN : public BaseSV
    {
    	protected:
    		string lop,maSV;
    	public:
    		void setLop(string lop){this->lop=lop;};
    		void setMaSV(string maSV){this->maSV=maSV;};		
    		string getLop(){return lop;};	
    		string getMaSV(){return maSV;};
    		void show();
    };
    
    void SinhVienIT::show()
    {
    	cout << "\tHo Ten	: " << ten << endl;
    	cout << "\tLop : " << lop << endl;
    	cout << "\tMa SV : " << maSV << endl;
    	cout << "\tDiem : " << diem << endl;
    }
    
    void SinhVienNN::show()
    {
    	cout << "\tHo Ten	: " << ten << endl;
    	cout << "\tLop : " << lop << endl;
    	cout << "\tMa SV : " << maSV << endl;
    	cout << "\tDiem : " << diem << endl;	
    }
    int main()
    {
    	int ok,ok1;
    	do
    	{
    		cout << "Sinh Vien IT " << endl;
    		string ten,lop,maSV;
    		int diem;
    		SinhVienIT A;
    		cout << "\tNhap ten : ";	
    		getline(cin,ten);
    		cout << "\tNhap lop : ";
    		getline(cin,lop);
    		cout << "\tMa SV : ";
    		getline(cin,maSV);
    		cout << "\tNhap diem : ";	cin >> diem;
    		A.setData(ten,diem);
    		A.setLop(lop);
    		A.setMaSV(maSV);
    		cout << "Tong quat : " << endl;
    		A.show();
    		cout << "Tiep tuc ? 1 = Yes | 0 = No ? ";
    		cin >> ok; 
    		cin.ignore();
    	}while(ok==1);
    
    	system("cls");
    
    	do
    	{
    		cout << "Sinh vien NN " << endl;
    		string ten,lop,maSV;
    		int diem;
    		SinhVienNN A;
    		cout << "\tNhap ten : ";	
    		getline(cin,ten);
    		cout << "\tNhap lop : ";
    		getline(cin,lop);
    		cout << "\tMa SV : ";
    		getline(cin,maSV);
    		cout << "\tNhap diem : ";	cin >> diem;
    		A.setData(ten,diem);
    		A.setLop(lop);
    		A.setMaSV(maSV);
    		cout << "Tong quat : " << endl;		
    		A.show();
    		cout << "Tiep tuc ? 1 = Yes | 0 = No ? ";
    		cin >> ok1; 
    		cin.ignore();
    	}while(ok1==1);
    	cout << endl;
    	system("pause");
    }
    Mong được giúp đỡ

  2. #2
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Nếu cậu mới học thì như vậy là tạm được rồi ... Sau này nhìn lại hi vọng cậu sẽ thấy khác.
    Keep moving forward!

    ... Retired ...

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

    class SinhVienIT : public BaseSV
    {
    protected:
    string lop,maSV;
    public:
    void setLop(string lop){this->lop=lop;};
    void setMaSV(string maSV){this->maSV=maSV;};
    string getLop(){return lop;};
    string getMaSV(){return maSV;};
    void show();
    };

    class SinhVienNN : public BaseSV
    {
    protected:
    string lop,maSV;
    public:
    void setLop(string lop){this->lop=lop;};
    void setMaSV(string maSV){this->maSV=maSV;};
    string getLop(){return lop;};
    string getMaSV(){return maSV;};
    void show();
    };
    cái prototype có vẻ ổn
    tuy nhiên cả 2 đều có lop,maSV như vậy thì tách 2 lớp con để làm gì

  4. #4
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Có nghĩa là thế là ổn à . Mình ko hiểu lớp cơ sở ảo cho lắm , mọi người giải thích rõ giùm mình được ko
    Ở lớp cơ sở có : virtual void show()=0 ; nghĩa là gì ?
    Sau đó ở các lớp dẫn xuất thì lại gọi hàm void() đó để làm gì ?
    Trích dẫn Nguyên bản được gửi bởi nguyentuan2 Xem bài viết
    cái prototype có vẻ ổn
    tuy nhiên cả 2 đều có lop,maSV như vậy thì tách 2 lớp con để làm gì
    Thầy nói cả hai lớp phải kế thừa từ lớp BaseSV nên phải thế , khổ cái là NN hay IT đều có cùng thuộc tính như maSV,que,lop nên thế .
    Nếu ta khai báo NN kế thừa thằng IT thì
    class SinhVienNN : public SinhvienIT
    {
    public:
    void show();
    }
    Phần định nghĩa hàm void thế này được ko nhỉ
    void SinhVienNN::show()
    {
    SinhVienIT::show();
    }

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Do mới vào làm quen nên thầy cậu ép buộc vậy thôi. Đúng ra thì cả _Ten, _MSSV, _MaLop, _DTB đều thuộc về class SinhVien cả.

    Nếu ta khai báo NN kế thừa thằng IT thì
    Nếu cậu làm vậy thì làm sai về mặt ngữ nghĩa. Thằng Ngoại ngữ và thằng IT đâu có dính dáng kiểu như vậy được

    Ở lớp cơ sở có : virtual void show()=0 ; nghĩa là gì ?
    Có nghĩa hàm Show là hàm "ảo" (ở đây là "thuần ảo"). Các lớp sau phải override lại phương thức này, tùy thuộc vào đặc điểm của lớp đó mà cách ứng xử đối với method Show() là khác nhau ....

    Nói chung còn nhiều điểm dính dáng tới cái OOP lắm. Cứ từ từ học sẽ hiểu !

    Chúc may mắn.
    Keep moving forward!

    ... Retired ...

  6. #6
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Wink Nhờ giải thích về Lớp cơ sở ảo

    Trích dẫn Nguyên bản được gửi bởi nhc1987 Xem bài viết
    Do mới vào làm quen nên thầy cậu ép buộc vậy thôi. Đúng ra thì cả _Ten, _MSSV, _MaLop, _DTB đều thuộc về class SinhVien cả.
    Thuộc lớp BaseSV phải ko

    Trích dẫn Nguyên bản được gửi bởi nhc1987 Xem bài viết
    Nếu cậu làm vậy thì làm sai về mặt ngữ nghĩa. Thằng Ngoại ngữ và thằng IT đâu có dính dáng kiểu như vậy được
    Thế dính dáng kiểu gì vậy

    Trích dẫn Nguyên bản được gửi bởi nhc1987 Xem bài viết
    Có nghĩa hàm Show là hàm "ảo" (ở đây là "thuần ảo"). Các lớp sau phải override lại phương thức này, tùy thuộc vào đặc điểm của lớp đó mà cách ứng xử đối với method Show() là khác nhau ....
    Mình ko hiểu rõ lắm , các lớp sau phải override lại phương thức này là thế nào nhỉ huh:
    rồi còn tùy thuộc vào đặc điểm của lớp đó mà cách ứng xử đối với method Show(); là khác nhau là thế nào nhỉ ?
    Có thể cho ví dụ rõ ràng được ko ? huh:

    Nói chung còn nhiều điểm dính dáng tới cái OOP lắm. Cứ từ từ học sẽ hiểu !

    Chúc may mắn.
    Đã được chỉnh sửa lần cuối bởi Alviss : 09-12-2007 lúc 09:11 PM.

  7. #7
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Thôi bó tay rồi, cậu kiếm cuốn sách cơ bản nào đó mà đọc lại đi rồi hãy làm tiếp. Không thôi bị hổng chân đấy.
    Keep moving forward!

    ... Retired ...

  8. #8
    Ngày gia nhập
    11 2007
    Bài viết
    47

    Bạn manu học trường ĐHCN đúgn ko, đây là bài tập ở trên lớp thày giao về nhà, sao bạn ko hỏi các bạn trong lớp nhỉ? Mình cũng học cùng lớp bạn đấy.Bạn có thể tham khảo code này:

    Code:
    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    //==============================================================================
    class BaseSV {
    protected:
    	string ten;
    	int diem;
    public:
    	void setData(string t, int d) {
    		ten = t; 
      		diem = d ;
    	}
    	void getData(string &t, int &d) {
    		t = ten; d = diem;
    	}
    	virtual void show()=0;
    };
    
    //==============================================================================
    class SinhVienIT:public BaseSV{
    private:
    	string language;
    public:
    	void setData(string ten,int diem, string nn){
    		BaseSV::setData(ten,diem);
    		//cout << language;
      		language = nn;
     	}
     	
      	void getData(string &t,int &d, string &nn){
    		BaseSV::getData(t,d);
    		nn = language; 	
      	}
      	
     	void show(){
    		cout << setw(20) << left << ten << setw(20) << diem << setw(15) << language
    				<< endl;
     	}
    };
    //==============================================================================
    class SinhVienNN:public BaseSV{
    private:
    	string first,second;//Ngon ngu thu nhat va thu 2
    public:
    	void setData(string ten,int diem, string nn1, string nn2){
    		BaseSV::setData(ten,diem);
      		first = nn1;
      		second = nn2;
     	}
     	
      	void getData(string &t,int &d, string &nn1, string &nn2){
    		BaseSV::getData(t,d);
    		nn1 = first;
    		nn2 = second;
      	}
      	
     	void show(){
    		cout << setw(20) << left << ten << setw(20) << diem << setw(15) << first
    				<< setw(15) << second << endl;
     	}
    };
    //==============================================================================
    main(){
    	SinhVienIT Sv1;
    	SinhVienNN Sv2;
    	BaseSV *p1,*p2;
    	p1 = &Sv1;
    	p2 = &Sv2;
    	Sv1.setData("Cao Van Viet",9,"C++,Pascal");
    	Sv2.setData("Le Minh Thu",8,"English","Chinese");
    	p1->show();
    	p2->show();
    	cin.ignore(1);
    }
    ở đây cái lớp ảo ( được khai báo dưối từ khóa vituarl) có tác dụng giống như template thôi

    Trong bài này thì
    Lớp cha BaseSV có 1 phương thức là show()
    Lớp này có 2 lớp con là SVIT và SVNN cũng có phương thức show()
    Giả sử bạn có 1 đối tượng là x thuộc lớp BaseSV
    Như thế nếu bạn gọi x.show() thì:
    -Nếu x là lớp SVIT thì gọi SVIT.show()
    -Nếu x là lớp SVNN thì gọi SVNN.show()
    -Nếu x không phải cả 2 lớp trên thì nó gọi BaseSV.show()

    Giờ nếu bạn không có từ khóa virtual, thì nó sẽ ko tìm kiếm các phương thức của các lớp con . Hay đơn giản trong ví dụ trên, nó sẽ chỉ gọi BaseSV.show()

    Trong code của mình như thế này:
    SinhVienIT Sv1;
    SinhVienNN Sv2;
    Sv1.setData("Cao Van Viet",9,"C++,Pascal");
    Sv2.setData("Le Minh Thu",8,"English","Chinese");
    --> đoạn code này đơn thuần là khởi tạo giá trị cho 2 đối tượng sv1 và sv2

    p1 = &Sv1;
    p2 = &Sv2;
    -> đoạn này bắt đầu chuyển từ kiểu class SVIT và SVNN về kiểu class của BaseSV

    p1->show();
    p2->show();
    -> đoạn này gọi hàm show. Do hàm show() khai báo từ khóa virtual nên nó sẽ kiểm tra kiểu của p1 và p2
    ở đây p1 được chuyển từ lớp SVIT, nên p1->show() <-> sv1.show()
    p2->show() <-> sv2.show()
    Nếu bạn không có từ khóa virtual, thì khi gọi hàm show() cả 2 cái này đều gọi phương thức show() của lớp BaseSV.
    OK?

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

    cậu này cũng nắm vững từ khóa virtual quá nhỉ

    Nhưng các cậu lưu ý là không có lớp ảo đâu nhé, chỉ có hàm ảo (virtual) thôi

    Sẵn đây hỏi các cậu luôn

    class A
    {
    virtual void fff(); // hàm ảo rõ ràng
    }

    class B: public A
    {
    void fff(); // có cần virtual nữa ko
    }

    class C: public B
    {
    void fff(); // thực ra là có virtual hay ko, nếu thêm virtual thì khác gì không
    }

  10. #10
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Giờ nếu bạn không có từ khóa virtual, thì nó sẽ ko tìm kiếm các phương thức của các lớp con . Hay đơn giản trong ví dụ trên, nó sẽ chỉ gọi BaseSV.show()
    Không đúng lắm. Cái bạn nói là hàm ảo. Còn ở đây là hàm "thuần ảo" => bỏ virtual ở đây không được


    Code:
    class A
    {
          virtual void fff(); // hàm ảo rõ ràng
    }
    
    class B: public A
    {
            void fff(); // có cần virtual nữa ko
    }
    
    class C: public B
    {
              void fff(); // thực ra là có virtual hay ko, nếu thêm virtual thì khác gì không
    }
    Theo tui thì cả 2 cái trên đều không cần, có cũng được, ko có cũng chả sao. Tuy nhiên do chuyện đời không ai biết trước được có thằng nào là con của các thằng B và C nữa hay không. Nên tốt nhất là lo trước : để virtual.
    Keep moving forward!

    ... Retired ...

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

  1. Cung cấp giấy ik plus, Paper One, Plus A+, Double A, Giấy Thái Lan, Giấy Bãi Bằng, bìa màu, băng dính, mica các loại
    Gửi bởi dungptvietthanh 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: 07-06-2013, 04:05 PM
  2. Chung cư Đại Thanh giảm sốc 10tr/vnđ cho các căn hộ. giảm và liên tục giảm…!!
    Gửi bởi lanthanh91 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: 09-10-2012, 10:27 AM
  3. Trả lời: 0
    Bài viết cuối: 06-08-2012, 07:01 PM
  4. Trả lời: 0
    Bài viết cuối: 04-08-2012, 03:08 PM
  5. Trả lời: 0
    Bài viết cuối: 24-05-2012, 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