Hỏi về đa hình trong OOP?

Xin chào mn, em có 1 class Chai:

#include <iostream>

using namespace std;

class Chai
{
protected:
	int chieuCao;
	int luongNuoc;
public:
	virtual void Nhap();
	virtual float TinhV() = 0;
	virtual float TinhSToanPhan() = 0;
	int GetLuongNuoc();
	Chai();
	~Chai();
};

và class này có 3 class con: class HinhCN, class HinhTruTron, class HinhLP:

#include"Chai.h"

class HinhCN : public Chai
{
private:
	int chieuDai;
	int chieuRong;
public:
	void Nhap();
	float TinhV();
	float TinhSToanPhan();
	HinhCN();
	~HinhCN();
};
class HinhTruTron : public Chai
{
private:
	int banKinh;
public:
	void Nhap();
	float TinhV();
	float TinhSToanPhan();
	HinhTruTron();
	~HinhTruTron();
};
class HinhLP : public Chai
{
public:
	void Nhap();
	float TinhV();
	float TinhSToanPhan();
	HinhLP();
	~HinhLP();
};

sau đó em có 1 class QLChai, class chai và class QLChai là quan hệ 1 - n:

#include"Chai.h"

class QLChai
{
private:
	int soLuong;
	Chai** danhSach;
	float TinhLuongNuoc();
	int TinhSManhVo();
public:
	void Nhap();
	void Xuat();
	QLChai();
	~QLChai();
};

trong class QLChai có con trỏ:

 Chai** danhSach

em cấp phát động cho nó:

cin >> soLuong;
danhSach = new Chai * [soLuong];

em đang có 1 mảng các con trỏ, em đang vướng là làm sao để cấp phát động cho từng con trỏ trong mảng vì class Chai đang là abstract class và 1 câu hỏi xấu hổ là truy xuất đến hàm nhập của 3 class con thông qua class QLChai kiểu gì, em mới học tới đa hình nên yếu phần này.

  • Bạn tạo các lớp con của Chai chứ, thế mới thành đa hình.
  • Lớp Chai đã khai báo phương thức Nhap() để bắt các lớp con triển khai. Bạn chỉ việc gọi nó bình thường.
Chai* c1 = new HinhCN(); // Hình thái HinhCN của Chai
Chai* c2 = new HinhLP(); // Hình thái HinhLP của Chai
c1->Nhap(); // gọi đến Nhap() của HinhCN
c1->Nhap(); // gọi đến Nhap() của HinhLP
2 Likes

dạ có, em có tạo 3 lớp con của Chai, và thay vì nhập xuất các lớp con trong hàm main thì đề bắt viết một lớp QLChai như sau

class QLChai
{
private:
	int soLuong;
	Chai** danhSach;
	float TinhLuongNuoc();
	int TinhSManhVo();
public:
	void Nhap();
	void Xuat();
	QLChai();
	~QLChai();
};

và em đang băn khoăn ở mỗi con trỏ Chai** danhSach; bởi bình thường em thấy từ lớp con truy xuất đến các phương thức public ở lớp cha chứ không làm ngược lại.

Sao bạn không dùng std::vector?

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?