Tải bản đầy đủ (.docx) (6 trang)

Chương 6 Tương ứng bội và phương thức ảo Lớp cơ sở trừu tượng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (78.93 KB, 6 trang )

Lớp cơ sở trừu tượng
5.1. Lớp cơ sở trừu tượng
Một lớp cơ sở trừu tượng là một lớp chỉ được dùng làm cơ sở cho các lớp khác. Không
hề có đối tượng nào của một lớp trừu tượng được tạo ra cả, bởi vì nó chỉ được dùng để định
nghĩa một số khái niệm tổng quát, chung cho các lớp khác. Một ví dụ về lớp trừu tượng là lớp
CON_VAT (con vật), nó sẽ dùng làm cơ sở để xây dựng các lớp con vật cụ thể như lớp
CON_CHO (con chó), CON_MEO (con mèo),... (xem ví dụ bên dưới)
Trong C++ , thuật ngữ “Lớp trừu tượng” đặc biệt áp dụng cho các lớp có chứa các phương
thức ảo thuần tuý. Phương thức ảo thuần tuý là một phương thức ảo mà nội dung của nó không
có gì. Cách thức định nghĩa một phương thức ảo thuần tuý như sau:
virtual void tên_phương_thức() = 0 ;
Ví dụ:
class A
{
public:
virtual void nhap() = 0 ;
virtual void xuat() = 0 ;
void chuong();
} ;
Trong ví dụ trên, thì A là lớp cơ sở trừu tượng. Các phương thức nhap và xuat được khai báo
là các lớp ảo thuần tuý (bằng cách gán số 0 cho chúng thay cho việc cài đặt các phương thức
này). Phương thức chuong() là một phương thức bình thường và sẽ phải có một định nghĩa ở
đâu đó cho phương thức này.
Không có đối tượng nào của một lớp trừu tượng lại có thể được phát sinh. Tuy nhiên các
con trỏ và các biến tham chiếu đến các đối tượng của lớp trừu tượng thì vẫn hợp lệ. Bất kỳ lớp
nào dẫn xuất từ một lớp cớ sở trừu tượng phải định nghĩa lại tất cả các phương thức thuần ảo
mà nó thừa hưởng, hoặc bằng các phương thức ảo thuần tuý, hoặc bằng những định nghĩa thực
sự. Ví dụ:
class B : public A
{
public:


virtual void nhap() = 0 ;
virtual void xuat()
{
// Các câu lệnh
}
} ;
Theo ý nghĩa về hướng đối tượng, ta vẫn có thể có một lớp trừu tượng mà không nhất thiết
phải chứa đựng những phương thức thuần tuý ảo.
343 344
Một cách tổng quát mà nói thì bất kỳ lớp nào mà nó chỉ được dùng làm cơ sở cho những
lớp khác đều có thể được gọi là “lớp trừu tượng”. Một cách dễ dàng để nhận biết một lớp trừu
tượng là xem có dùng lớp đó để khai báo các đối tượng hay không? . Nếu không thì đó là lớp
cơ sở trừu tượng.
5.2. Ví dụ
Giả sử có 20 ô, mỗi ô có thể nuôi một con chó hoặc một con mèo. Yêu cầu xây dựng
chương trình gồm các chức năng:
+ Nhập một con vật mới mua (hoặc chó, hoặc mèo) vào ô rỗng đầu tiên.
+ Xuất (đem bán) một con vật (hoặc chó, hoặc mèo).
+ Thống kê các con vật đang nuôi trong 20 ô.
Chương trình được tổ chức như sau:
+ Trước tiên định nghĩa lớp CON_VAT là lớp cơ sở ảo. Lớp này có một thuộc tính là tên con
vật và một phương thức ảo dùng để xưng tên.
+ Hai lớp là CON_MEO và CON_CHO được dẫn xuất từ lớp CON_VAT
+ Cuối cùng là lớp DS_CON_VAT (Danh sách con vật) dùng để quản lý chung cả mèo và
chó. Lớp này có 3 thuộc tính là: số con vật cực đại (chính bằng số ô), số con vật đang nuôi và
một mảng con trỏ kiểu CON_VAT. Mỗi phần tử mảng sẽ chứa địa chỉ của một đối tượng kiểu
CON_MEO hoặc CON_CHO.
Lớp sẽ có 3 phương thức để thực hiện 3 chức năng nêu trên của chương trình. Nội dung
chương trình như sau:
//CT6-04

// Lop co so truu tuong
// Lop CON_VAT
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <ctype.h>
#include <string.h>
class CON_VAT
{
protected:
char *ten;
public:
CON_VAT()
{
ten = NULL;
}
CON_VAT(char *ten1)
{
ten = strdup(ten1);
}
345 346
virtual void xung_ten()
{
}
} ;
class CON_MEO:public CON_VAT
{
public:
CON_MEO() : CON_VAT()
{

}
CON_MEO(char *ten1) : CON_VAT(ten1)
{
}
virtual void xung_ten()
{
cout << "\nToi la chu meo: " << ten ;
}
};
class CON_CHO:public CON_VAT
{
public:
CON_CHO() : CON_VAT()
{
}
CON_CHO(char *ten1) : CON_VAT(ten1)
{
}
virtual void xung_ten()
{
cout << "\nToi la chu cho: " << ten ;
}
};
class DS_CON_VAT // Danh sach con vat
{
private:
int max_so_con_vat;
int so_con_vat;
CON_VAT **h ;
public:

DS_CON_VAT(int max);
~DS_CON_VAT();
int nhap(CON_VAT *c);
CON_VAT* xuat(int n);
void thong_ke();
} ;
DS_CON_VAT::DS_CON_VAT(int max)
{
max_so_con_vat = max;
so_con_vat = 0;
h = new CON_VAT*[max];
for (int i=0; i<max; ++i)
h[i] = NULL;
}
DS_CON_VAT::~DS_CON_VAT()
{
max_so_con_vat = 0;
so_con_vat = 0;
delete h;
}
int DS_CON_VAT::nhap(CON_VAT *c)
{
if (so_con_vat==max_so_con_vat)
return 0;
int i=0;
while (h[i]!=NULL) ++i;
h[i]=c;
so_con_vat++ ;
return (i+1);
}

CON_VAT* DS_CON_VAT::xuat(int n)
{
if (n<1 || n > max_so_con_vat)
return NULL ;
--n ;
if (h[n])
{
CON_VAT *c = h[n];
347 348
h[n]=NULL;
so_con_vat-- ;
return c;
}
else
return NULL;
}
void DS_CON_VAT::thong_ke()
{
if (so_con_vat)
{
cout << "\n" ;
for (int i=0; i<max_so_con_vat; ++i)
if (h[i])
h[i]->xung_ten();
}
}
CON_CHO c1("MUC");
CON_CHO c2("VEN");
CON_CHO c3("LAI");
CON_CHO c4("NHAT");

CON_CHO c5("BONG");
CON_MEO m1("MUOP");
CON_MEO m2("DEN");
CON_MEO m3("TRANG");
CON_MEO m4("TAM THE");
CON_MEO m5("VANG");
void main()
{
DS_CON_VAT d(20);
clrscr();
d.nhap(&c1);
int im2 = d.nhap(&m2);
d.nhap(&c3);
d.nhap(&m1);
int ic4 = d.nhap(&c4);
d.nhap(&c5);
d.nhap(&m5);
d.nhap(&c2);
d.nhap(&m3);
349 350

×