Cách sử dụng kế thừa để xây dựng nên các lớp trong C++?

Mình để code như thế này:

#include<iostream>
using namespace std;
class HoaDon
{
private:
	int soLuong;
	double giaCa;
public:
	HoaDon();
	HoaDon(int sl, double gc);
	double tongTien();
	void setGiaCa(double giaMoi);
	void inHoadon();
};
int main()
{
	HoaDon hoaDon(3, 1000);
	cout << "Thong tin hoa don: ";
	hoaDon.inHoadon();
	cout <<endl;
	cout << "Moi nhap thong tin hoa don cua ban: ";
	HoaDon hoaDon2;
	hoaDon2.setGiaCa(2000);
	cout << "\n\n\t\t* Thong tin hoa don cua ban: ";
	hoaDon2.inHoadon();
	cout <<endl;
	system("PAUSE");
	return 0;
}
HoaDon::HoaDon() : soLuong(1), giaCa(10){
}
HoaDon::HoaDon(int sl, double gc) : soLuong(sl), giaCa(gc){
}
double HoaDon::tongTien(){
	
	double tongTien = soLuong * giaCa;
	return soLuong * giaCa;
}
void HoaDon::setGiaCa(double giaMoi)
{
	giaCa = giaMoi;
}
	
void HoaDon::inHoadon(){
	cout << "\nSo luong: "<<soLuong;
	cout << "\nGia cua 1 san pham: "<<giaCa;
	cout << "\nTong tien can thanh toan: "<<tongTien();
}

Nó chạy được và ra là:

Thông tin hóa đơn:
Số lượng: 3
Giá của 1 sản phẩm: 1000
Tổng tiền cần thanh toán: 3000
Mời bạn nhập thông tin hóa đơn của bạn
Thông tin hóa đơn của bạn
Số lượng: 1
Giá của 1 sản phẩm: 2000
Tổng tiền cầ thanh toán: 2000.
Hết______________________________________
Vậy làm sao để nhập giá cả từ bàn phím được hả bạn??

1 Like

:stuck_out_tongue:
Tham số khác đối số nhé bạn

hàm  setGiaCa(double x)  // x o day la tham so
nhung khi ban goi hàm tu nơi khac hoadon.setGiaCa(double y) // y = 2000 la doi so dc truyen vao

Bạn nên suy nghĩ hiểu đề trước đã.
Class HoaDon để thể hiện các instance hóa đơn mà ở đây có giá và số lượng

1 Like

Nếu bạn muốn nhập giá cả từ bàn phím thì trong hàm setGiaca(double giaca) bạn phải cho người dùng nhập vào chứ không phải là gán luôn giá trị.

Vậy bài này không cần nhập giá cả từ bàn phím đúng không. Chỉ cần in ra màn hình đúng không bạn?

Nhưng mình không biết cái hàm setGiâC(double giaMoi) phải viết thế nào… Bạn giúp mình với.

Mình sửa theo code của bạn thôi nhé :stuck_out_tongue:

void HoaDon::setGiaCa(double giaMoi)
{
	cout<<endl<<"Nhap gia moi: ";
	cin>>giaMoi;
	giaCa = giaMoi;
}
1 Like

Mình làm được ra như thế này:

#include<iostream>
using namespace std;
class HoaDon
{
	protected:
		int soLuong;
		double giaCa;
	public:
		HoaDon();
		HoaDon(int sl, double gc);
		double tongTien();
		void setGiaCa(double giaMoi);
		void inHoadon();
};
int main()
{
	HoaDon hoaDon1(3, 50);
	cout << "Thong tin hoa don thu 1";
	hoaDon1.inHoadon();
	cout <<endl;
	cout << "\nThong tin hoa don thu 2 ";
	HoaDon hoaDon2(4, 20);
	hoaDon2.inHoadon();
	cout <<endl;
	cout << "\nThong tin hoa don thu 3 ";
	HoaDon hoaDon3(10, 30);
	hoaDon3.inHoadon();
	cout <<endl;
	cout << "\n\n\t\t ----------------------------------------------"<<endl;
	system("PAUSE");
	return 0;
}
HoaDon::HoaDon() : soLuong(1), giaCa(10){
}
HoaDon::HoaDon(int sl, double gc) : soLuong(sl), giaCa(gc){
}
double HoaDon::tongTien(){
	return soLuong * giaCa;
}
void HoaDon::setGiaCa(double giaMoi){
	giaCa = giaMoi;
}
void HoaDon::inHoadon(){
	cout << "\nSo luong san pham: "<<soLuong;
	cout << "\nGia cua 1 san pham: "<<giaCa;
	cout <<	"\nTong tien: "<<tongTien();
};
class HoaDonKM  : public HoaDon{
private:
	double giamGia;
public:
	HoaDonKM();
	HoaDonKM(int sl, double gc, double gg);
	double thanhToan();
	void inHoadon();
};
HoaDonKM::HoaDonKM():giamGia(2){
	HoaDon::HoaDon();
}
HoaDonKM::HoaDonKM(int sl, double gc, double gg):giamGia(gg){
	HoaDon::HoaDon(sl, gc);
}
double HoaDonKM::thanhToan(){
	HoaDon::tongTien();
	return  tongTien() - giamGia * soLuong;
}
void HoaDonKM::inHoadon(){
	HoaDon::inHoadon();
	cout << "\n 1 san pham ban duoc giam gia: "<<giamGia;
	cout << "\n Tong tien ban phai tra: "<<thanhToan();
}

Nhưng mình không thể in ra sản phẩm giảm giá được. Mình nghĩ mình viết sai chô lớp kế thừa. Nhưng chạy trường chình vẫn đúng…

//định nghĩa class Hóa đơn
class Hoadon{
protected:
	int soLuongsanpham;
	double giaSanpham;
public:
	Hoadon();
	Hoadon(int soLuong,double giaCa);
	double tongtien();
	void setGiaca(double giaMoi);
	void inHoadon();
};
//định nghĩa hàm dựng không tham số của lớp Hóa đơn.
Hoadon::Hoadon(){
	soLuongsanpham=1;
	giaSanpham=10;
}
//định nghĩa hàm dựng có tham số của lớp Hóa đơn.
Hoadon::Hoadon(int soLuong,double giaCa){
	soLuongsanpham=soLuong;
	giaSanpham=giaCa;
}
//định nghĩa hàm khởi tạo một giá trị mới cho gia San pham
void Hoadon::setGiaca(double giaMoi){
	giaSanpham=giaMoi;
}
//đinh nghĩa hàm tính tổng tiền trong lớp Hóa đơn
double Hoadon::tongtien(){
	return soLuongsanpham*giaSanpham;
}
//định nghĩa hàm in Hóa đơn trong lớp Hóa đơn.
void Hoadon::inHoadon(){
	cout<<"\nSo san pham: "<<this->soLuongsanpham;
	cout<<"\nGia mot san pham: "<<this->giaSanpham;
	cout<<"\nTong tien can thanh toan:"<<this->tongtien();
}
//định nghĩa lớp HoadonKM
class HoadonKM : public Hoadon{
private:
	double giamGia;
public:
	HoadonKM();
	HoadonKM(int soLuong,double giaCa,double giamGia);
	double thanhToan();
	void inHoadonKM();
};
//định nghĩa hàm dựng không tham số trong lớp HoadonKM
HoadonKM::HoadonKM(){
	Hoadon::Hoadon();
	giamGia=2;
}
//định nghĩa hàm dựng có tham số trong lớp HoadonKM
HoadonKM::HoadonKM(int soLuong,double giaCa,double giamGia){
	soLuongsanpham=soLuong;
	giaSanpham=giaCa;
	this->giamGia=giamGia;
}
//định nghĩa hàm thanhtoan trong lớp HoadonKM
double HoadonKM::thanhToan(){
	return Hoadon::tongtien()-giamGia*soLuongsanpham;
}
//định nghĩa hàm in Hóa đơn trong lớp HoadonKM
void HoadonKM::inHoadonKM(){
	Hoadon::inHoadon();
	cout<<"\nSo tien duoc khuyen mai: "<<giamGia*soLuongsanpham;
	cout<<"\nSo tien can phai tra sau khi khuyen mai: "<<thanhToan();
}

Mình định nghĩa các lớp như thế này được chưa mọi người.Nếu có gì sai nhờ fix lại giúp mình.

sao phải tham chiếu thế???

2 Likes

Cái đó mình nhầm đó,không cần tham chiếu đâu.

sao trong khai báo vẫn có thế? không lỗi mới lạ @@

3 Likes

em gà quá xin phép mượn anh để trả lời nếu có người chưa nắm rõ

- tham trị : Khi truyền tham trị, trình biên dịch sẽ tạo 1 bản sao và truyền bản sao đó vào nới muốn truyền, do đó mọi thay đổi sẽ sảy ra trên bản sao này và ko ảnh hưởng đến biến gốc.

- tham chiếu : Còn truyền tham chiếu thì nó sẽ truyền ngay địa chỉ hay gọi là chính cái biến đó vào nơi cần truyền luôn, nên ở trong hàm mà mình truyền vào có thay đổi gì thì biến ngoài cũng thay đổi theo.
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?