Ôn tập 1// Các kiểu dữ liệu cơ bản: kích cỡ (số byte), phạm vi, tương
thích kiểu (tự động tương thích, phải ép kiểu)
Để có thể chuyển đổi hai dữ liệu này từ bit sang Byte thì ta sẽ lấy chính số đó
chia cho 8 còn đối với chuyển từ Byte sang bit thì ta lấy số đó nhân với 8
2// Các phép toán cơ bản (logic bit, tốc ký)
Các phép toán trên bit:
Phép AND
&
Phép OR
|
Phép phủ định NOT
~
Phép XOR
^
Phép dịch trái
<<
Phép dịch phải
>>
Phép
AND
Phép OR giữa 2 bit sẽ trả về 1 nếu có ít nhất 1 trong 2 bit có giá trị bằng 1, ngược lại nó sẽ trả về 0.
Phép NOT là phép đảo bit
Phép XOR giữa 2 bit sẽ trả về 1 khi 2 bit có giá trị khác nhau, ngược lại nó sẽ trả về 0
Phép dịch trái là phép dịch tất cả các bit sang trái. Ví dụ:
A << 2
tương đương với tất cả các bit sang trái 2 đơn vị.
Phép dịch phải là phép dịch tất cả các bit sang phải. Ví dụ:
Muốn lấy ra giá trị tại bit thứ n của số a bạn có thể làm như sau:
Cout << (a & (1 << (n – 1)));
Giải thích:
1 << (n - 1);
sẽ trả về một số có bit thứ n từ phải qua là 1 và các bit khác là bit 0. Kết quả của
s này với a sẽ trả về một số có giá trị 0 nếu bit thứ n trong a0 và trả về một s
phép AND
khác
0
nếu bit thứ
n
trong
a
khác
0
.
Cách khác: cout << (1 & (a >> (n – 1)));
Muốn tắt bit thứ n của số a bạn có thể dùng công thức sau.
a = a & (~(1 << (n – 1)));
3// Phạm vi của biến (có những loại biến gì, biến toàn cục, cục bộ,
tham số của hàm, nằm đâu trong vùng nhớ)
Cục bộ, tham số nằm trong stack -> được tự động thu hồi vùng nhớ của nó khi ra khỏi phạm vi
Biến toàn cục nằm trong vùng nhớ của chương trình, bị thu hồi khi đóng chương trình
Vùng nhớ động được quản lý bởi con trỏ (nằm trong Heap), được giải phóng khi dùng lệnh free ( C ), delete ( C++ )
4// Các kiểu dữ liệu dẫn xuất trực 琀椀 ếp
Enum: số nguyên, phạm vi nhỏ (do mình định ra), giá trị liệt kê trong enum là các hằng số nguyên (gtri có sẵn ko đổi).
Nếu ko gán gtri ban đầu thì số đầu 琀椀 ên mang giá trị 0, các số sau lần lượt tăng lên 1 đơn vị. Không gán trực 琀椀
ếp, phải ép kiểu
Kiểu hằng: giá trị ko đổi trong chương trình (const)
Kiểu con tr:
+ Con trỏ quản lý 1 biến:
+ Con trỏ quản lý vùng cấp phát động (mảng động)
+ Con trỏ quản lý 1 mảng nh
Kiểu mảng: mảng chuỗi, mảng kí tự (trong C xâu ký tự có byte kết 0 = (‘\0’))
VD: Char *name[50];
Nhập dữ liệu cho name: cin.getline(name, 50)
String name;
Nhập dữ liệu cho name: getline(cin, name)
Nếu trc lệnh nhập vào 1 chuỗi mà có lệnh nhập vào 1 số thì cần xóa bộ đệm bằng lệnh cin.ignore();
Kiểu tham chiếu
VD: int x = 5;
Int &r = x; // r ko được cấp vùng nhớ mới, r nằm cùng vùng nhớ với x (có thể dùng r thay cho x)
Lưu ý: r chỉ tham chiếu đến biến trong chương trình. Lúc tham chiếu đến biến này lúc tham chiếu đến biến khác.
Ý nghĩa: dùng để chuyền tham chiếu cho hàm
5// Struct
Lưu ý đến mảng các struct, con trỏ quản lý các struct
6// Các lệnh điểu khiển chương trình
For, while, do… while, switch… case, if, if…else, break, con 琀椀 nue
Trong vòng lặp for nếu dùng break -> thoát khỏi vòng lặp; con 琀椀 nue -> b qua các lệnh dưới nớ để thực hiện lần
lặp 琀椀 ếp theo
Switch (lưu ý break)
7// Hàm
+ 3 kiểu truyền hàm
Truyền giá trị = chỉ dùng để nh toán; truyền con trỏ (truyền địa chỉ, truyn mảng) = dùng để thay đổi đầu vào ca
hàm hoặc khi kích thước dliệu đầu vào quá lớn thì dùng để giúp tránh sao chép; truyền tham chiếu khi dùng để
thay đổi đầu vào của hàm hoặc lưu đầu ra của hàm hoặc khi kích thước dữ liệu đầu vào quá lớn -> tránh sao chép.
VD: int 琀椀 nhTong(int a, int b) {Return a + b; } // hàm có hai đầu vào
Void 琀椀 nhTong(int a, int b, int& tong) // 2 cái đầu là đầu vào, cái cuối là đầu ra
Cơ chế tr về của hàm: hàm có thể trả về (return) bất kỳ kiểu gì trừ kiểu mảng
+ Hàm nội tuyến: thực chất không phải là hàm -> ko thực hiện cơ chế gi hàm
Dùng hàm nội tuyến khi ưu 琀椀 ên tốc độ hơn tài nguyên (cơ chế gọi hàm mất thời gian). Nên dùng khi đoạn code
ngắn. + Hàm có tham số mặc định: lưu ý là dãy tham số mặc định phải nm cuối của dãy tham số
8// Quản lý bộ nhớ động
+ Cấp phát đủ dùng (trong khi chương trình chạy)
Mảng nh (số phần tử c định chiếm cứng trong b nhớ -> lãng phí tài nguyên, kém linh hoạt)
Mảng động thì linh hoạt hơn nhưng dễ rò rỉ bộ nhớ do ko để ý giải phóng bộ nhớ.
Cách dùng mảng động thì như mảng nh
BT tự luận scó mảng động
Mảng động 2 chiều
9// Định nghĩa lớp (định nghĩa kiểu dữ liệu mới)
+ Biến thành viên
+ Hàm thành viên
// Các loại hàm thành viên trong lớp
+ Hàm tạo: khởi tạo giá trị cho đối tượng, cấp phát bộ nhớ động cho biến thành viên của đi tượng. Có nhiều hàm
tạo (mặc định, tham số mặc địch, truyền đủ tham số), nên định nghĩa hàm tạo tham số mặc định
+ Hàm hủy: chỉ cần đ/n khi lớp có hbieens thành viên là con trỏ vùng nhớ động để hủy vùng nhớ động đó
+ Các hàm ge 琀琀 er(lấy), se 琀琀 er (gán)
+ Hàm tạo sao chép: chỉ cần định nghĩa khi lớp có biến thành viên là con trquản lý vùng nhớ động.
+ Hàm toán tử gán: chỉ cần định nghĩa khi lớp có biến thành viên là trquản lý vùng nhớ động.
+ Hàm định nghĩa lại các toán tử: +, -, *,/,+=, -+,*=, /=, các toán tử so sánh <, >, …. Toán tử chỉ số [], toán tử gọi hàm
()… (có thể là các hàm thành viên hoặc hàm bạn)
+ Định nghĩa lại toán tử nhập, xuất
10// Lớp dẫn xuất và thừa kế
/ Ý nghĩa: mở rng lớp cơ sở, thừa hưởng các thuộc nh, phương hướng của lớp cơ sở và bổ sung thêm các thuộc
nh và phương thức chuyên biệt của nó.
/ Hàm tạo: ko thừa hưởng được, luôn cần gọi qua dấu liệt kê khởi tạo (:) => lớp dẫn xuất luôn cần định nghĩa hàm tạo
dù ko bổ sung biến mới. Lớp không định nghĩa hàm to ở lớp dẫn xuất thì trình biên dịch tự sinh hàm tạo để gọi hàm
tạo mặc định (không code, ko đổi) của lớp cơ sở.
/ Hàm hủy, hàm tạo sao chép, hàm toán tử gán: chỉ cần định nghĩa khi lớp dẫn xuất có biến mới là quản lý b nh
động (khi ko định nghĩa chúng ở class dẫn xuất, trình biên dịch tự động gọi các hàm đó ở lớp cơ sở
/ Hàm bạn thì không thừa hưởng được
/ Cơ chế đa hình: một đối tượng thuộc lớp cơ sở có thquản lý đối tượng thuộc lớp dẫn xuất. Khi dùng đối tượng
y để gọi phương thức của lớp dẫn xuất => gi phương thức của lớp cơ sở (liên kết nh). Muốn phái vỡ liên kết
nh này (muốn gọi đến hàm của lớp dẫn xuất) => khai báo hàm của lớp cơ sở là ảo bằng từ khóa “virtual”.
/ Hàm thuần ảo, lớp thuần ảo:
// Hàm thuần ảo: là hàm ảo chỉ có khai báo, không có định nghĩa
// Lớp thuần ảo: chứa ít nhất 1 hàm thuần ảo
// Lớp thuần ảo trở thành dao diện (ko dùng được, không khai báo đối tượng được) => cần định nghĩa lớp dẫn xuất
để triển khai các phương thức thuần ảo trên.
Giúp tách phần khai báo và phần thực hiên, làm code dễ đọc, dễ phát triển
/ Hàm hủy là hàm ảo => có thử dùng con trỉ của lớp cơ sở để hủy đối tượng của lớp dẫn xuất
/ Các quyền thừa kế
// Quyền public: (class B: public A)
Public A trở thành public của B
Protected của A trở thành protected của B
Private của A thì B thừa hưởng được nhưng ko truy nhập (gọi thẳng, .) trực 琀椀 ếp đc
// Protected; (class B: protected A)
Public A trở thành protected của B (dùng trong nội bộ A, B và dẫn xuất của B)
Protected A trở thành protected của B (được dùng trong các lớp dẫn xuất của A và các lớp dẫn xuất của B)
Private của A thì B thừa hưởng được nhưng ko truy nhập (gọi thẳng, .) trực 琀椀 ếp
đc // Private: (class B: A)
Tt cả public, protected của A thành private của B (chỉ được dùng trong B)
Private của A thì B thừa hưởng đc nhưng ko truy nhập trực 琀椀 ếp đc
/ Tương thích kiu
// Đối tượng thuộc lớp dẫn xuất được sao chép cho đối tượng thuộc lớp cơ sở. Ngược lại thì ko đúng
// Con trỏ của lớp cơ sở quản lý đc đối tượng thuộc lớp dẫn xuất. Ngc lại ko đúng
// Có thể ép kiểu
Bài 1:
Xây dựng lớp Shape gồm 2 biến thành viên: color (string), 昀椀 lled (Boolean) và các hàm thành viên sau:
hàm tạo, hàm getColor, hàm setColor, hàm setFilled(), hàm isFilled, hàm getArea() thun ảo, hàm
getPerimeter() thuần o.
Xây dựng lớp Circle là dẫn xuất với quyền public của lớp Shape, có thêm biến radius (double), có thêm
các hàm: getRadius(), setRadius, triển khai các hàm nh chu vi, diện ch
Định nghĩa lớp Rectangle có thêm biến width (double) và height (double) và các hàm: getWidth,
setWidth, getHeight, setHeight, nh chu vi và diện ch.
Viết chương trình sử dụng các lớp trên
// Khai báo lớp Shape
class Shape {
// Khai báo các biến thành viên
protected:
string color; // Màu của hình
bool 昀椀 lled; // Được tô màu hay không
public:
// Hàm tạo mặc định
Shape() { color =
"red"; 昀椀 lled =
true;
}
// Hàm tạo có tham s
Shape(string color, bool 昀椀
lled) { this->color = color;
this->昀椀 lled = 昀椀 lled;
}
// Hàm lấy màu
string getColor() {
return color;
}
// Hàm đặt màu void
setColor(string color) {
this->color = color;
}
// Hàm kiểm tra tô màu
bool isFilled() {
return 昀椀 lled;
}
// Hàm đặt tô màu
void setFilled(bool 昀椀 lled) {
this->昀椀 lled = 昀椀 lled;
}
// Hàm nh diện ch thuần
ảo virtual double getArea() = 0;
// Hàm nh chu vi thun ảo
virtual double getPerimeter() = 0;
};
// Khai báo lớp Circle kế thừa từ lớp Shape
class Circle : public Shape { // Khai báo
biến thành viên private:
double radius; // Bán kính của hình tròn
public:
// Hàm tạo mặc định
Circle() : Shape() {
radius = 1.0;
}
// Hàm tạo có tham s
Circle(double radius, string color, bool 昀椀 lled) : Shape(color, 昀椀 lled) {
this->radius = radius;
}
// Hàm lấy bán kính
double getRadius() {
return radius;
}
// Hàm đặt bán kính void
setRadius(double radius) {
this->radius = radius;
}
// Hàm nh diện ch
double getArea() { return
3.14 * radius * radius;

Preview text:

Ôn tập 1// Các kiểu dữ liệu cơ bản: kích cỡ (số byte), phạm vi, tương
thích kiểu (tự động tương thích, phải ép kiểu)
Để có thể chuyển đổi hai dữ liệu này từ bit sang Byte thì ta sẽ lấy chính số đó
chia cho 8 còn đối với chuyển từ Byte sang bit thì ta lấy số đó nhân với 8
2// Các phép toán cơ bản (logic bit, tốc ký)
Các phép toán trên bit: Phép AND & Phép OR | Phép phủ định NOT ~ Phép XOR ^ Phép dịch trái << Phép dịch phải >>
Phép AND giữa 2 bit sẽ trả về 1 khi cả 2 bit đều có giá trị bằng 1, ngược lại nó sẽ trả về 0.
Phép OR giữa 2 bit sẽ trả về 1 nếu có ít nhất 1 trong 2 bit có giá trị bằng 1, ngược lại nó sẽ trả về 0.
Phép NOT là phép đảo bit
Phép XOR giữa 2 bit sẽ trả về 1 khi 2 bit có giá trị khác nhau, ngược lại nó sẽ trả về 0
Phép dịch trái là phép dịch tất cả các bit sang trái. Ví dụ:
A << 2 tương đương với tất cả các bit sang trái 2 đơn vị.
Phép dịch phải là phép dịch tất cả các bit sang phải. Ví dụ:
Muốn lấy ra giá trị tại bit thứ n của số a bạn có thể làm như sau:
Cout << (a & (1 << (n – 1))); Giải thích:
1 << (n - 1); sẽ trả về một số có bit thứ n từ phải qua là 1 và các bit khác là bit 0. Kết quả của phép s
AND ố này với a sẽ trả về một số có giá trị 0 nếu bit thứ n trong a là 0 và trả về một số
khác 0 nếu bit thứ n trong a khác 0 .
Cách khác: cout << (1 & (a >> (n – 1)));
Muốn tắt bit thứ n của số a bạn có thể dùng công thức sau.
a = a & (~(1 << (n – 1)));
3// Phạm vi của biến (có những loại biến gì, biến toàn cục, cục bộ,
tham số của hàm, nằm đâu trong vùng nhớ)
Cục bộ, tham số nằm trong stack -> được tự động thu hồi vùng nhớ của nó khi ra khỏi phạm vi
Biến toàn cục nằm trong vùng nhớ của chương trình, bị thu hồi khi đóng chương trình
Vùng nhớ động được quản lý bởi con trỏ (nằm trong Heap), được giải phóng khi dùng lệnh free ( C ), delete ( C++ )
4// Các kiểu dữ liệu dẫn xuất trực 琀椀 ếp
Enum: số nguyên, phạm vi nhỏ (do mình định ra), giá trị liệt kê trong enum là các hằng số nguyên (gtri có sẵn ko đổi).
Nếu ko gán gtri ban đầu thì số đầu 琀椀 ên mang giá trị 0, các số sau lần lượt tăng lên 1 đơn vị. Không gán trực 琀椀 ếp, phải ép kiểu
Kiểu hằng: giá trị ko đổi trong chương trình (const) Kiểu con trỏ:
+ Con trỏ quản lý 1 biến:
+ Con trỏ quản lý vùng cấp phát động (mảng động)
+ Con trỏ quản lý 1 mảng 琁⤀nh
Kiểu mảng: mảng chuỗi, mảng kí tự (trong C xâu ký tự có byte kết 0 = (‘\0’)) VD: Char *name[50];
Nhập dữ liệu cho name: cin.getline(name, 50) String name;
Nhập dữ liệu cho name: getline(cin, name)
Nếu trc lệnh nhập vào 1 chuỗi mà có lệnh nhập vào 1 số thì cần xóa bộ đệm bằng lệnh cin.ignore(); Kiểu tham chiếu VD: int x = 5;
Int &r = x; // r ko được cấp vùng nhớ mới, r nằm cùng vùng nhớ với x (có thể dùng r thay cho x)
Lưu ý: r chỉ tham chiếu đến biến trong chương trình. Lúc tham chiếu đến biến này lúc tham chiếu đến biến khác.
Ý nghĩa: dùng để chuyền tham chiếu cho hàm 5// Struct
Lưu ý đến mảng các struct, con trỏ quản lý các struct
6// Các lệnh điểu khiển chương trình
For, while, do… while, switch… case, if, if…else, break, con 琀椀 nue
Trong vòng lặp for nếu dùng break -> thoát khỏi vòng lặp; con 琀椀 nue -> bỏ qua các lệnh dưới nớ để thực hiện lần lặp 琀椀 ếp theo Switch (lưu ý break) 7// Hàm + 3 kiểu truyền hàm
Truyền giá trị = chỉ dùng để 琀 nh toán; truyền con trỏ (truyền địa chỉ, truyền mảng) = dùng để thay đổi đầu vào của
hàm hoặc khi kích thước dữ liệu đầu vào quá lớn thì dùng để giúp tránh sao chép; truyền tham chiếu khi dùng để
thay đổi đầu vào của hàm hoặc lưu đầu ra của hàm hoặc khi kích thước dữ liệu đầu vào quá lớn -> tránh sao chép.
VD: int 琀椀 nhTong(int a, int b) {Return a + b; } // hàm có hai đầu vào
Void 琀椀 nhTong(int a, int b, int& tong) // 2 cái đầu là đầu vào, cái cuối là đầu ra
Cơ chế trả về của hàm: hàm có thể trả về (return) bất kỳ kiểu gì trừ kiểu mảng
+ Hàm nội tuyến: thực chất không phải là hàm -> ko thực hiện cơ chế gọi hàm
Dùng hàm nội tuyến khi ưu 琀椀 ên tốc độ hơn tài nguyên (cơ chế gọi hàm mất thời gian). Nên dùng khi đoạn code
ngắn. + Hàm có tham số mặc định: lưu ý là dãy tham số mặc định phải nằm ở cuối của dãy tham số
8// Quản lý bộ nhớ động
+ Cấp phát đủ dùng (trong khi chương trình chạy)
Mảng 琁⤀nh (số phần tử cố định chiếm cứng trong bộ nhớ -> lãng phí tài nguyên, kém linh hoạt)
Mảng động thì linh hoạt hơn nhưng dễ rò rỉ bộ nhớ do ko để ý giải phóng bộ nhớ.
Cách dùng mảng động thì như mảng 琁⤀nh
BT tự luận sẽ có mảng động Mảng động 2 chiều
9// Định nghĩa lớp (định nghĩa kiểu dữ liệu mới) + Biến thành viên + Hàm thành viên
// Các loại hàm thành viên trong lớp
+ Hàm tạo: khởi tạo giá trị cho đối tượng, cấp phát bộ nhớ động cho biến thành viên của đối tượng. Có nhiều hàm
tạo (mặc định, tham số mặc địch, truyền đủ tham số), nên định nghĩa hàm tạo tham số mặc định
+ Hàm hủy: chỉ cần đ/n khi lớp có hbieens thành viên là con trỏ vùng nhớ động để hủy vùng nhớ động đó
+ Các hàm ge 琀琀 er(lấy), se 琀琀 er (gán)
+ Hàm tạo sao chép: chỉ cần định nghĩa khi lớp có biến thành viên là con trỏ quản lý vùng nhớ động.
+ Hàm toán tử gán: chỉ cần định nghĩa khi lớp có biến thành viên là trỏ quản lý vùng nhớ động.
+ Hàm định nghĩa lại các toán tử: +, -, *,/,+=, -+,*=, /=, các toán tử so sánh <, >, …. Toán tử chỉ số [], toán tử gọi hàm
()… (có thể là các hàm thành viên hoặc hàm bạn)
+ Định nghĩa lại toán tử nhập, xuất
10// Lớp dẫn xuất và thừa kế
/ Ý nghĩa: mở rộng lớp cơ sở, thừa hưởng các thuộc 琀 nh, phương hướng của lớp cơ sở và bổ sung thêm các thuộc
琀 nh và phương thức chuyên biệt của nó.
/ Hàm tạo: ko thừa hưởng được, luôn cần gọi qua dấu liệt kê khởi tạo (:) => lớp dẫn xuất luôn cần định nghĩa hàm tạo
dù ko bổ sung biến mới. Lớp không định nghĩa hàm tạo ở lớp dẫn xuất thì trình biên dịch tự sinh hàm tạo để gọi hàm
tạo mặc định (không code, ko đổi) của lớp cơ sở.
/ Hàm hủy, hàm tạo sao chép, hàm toán tử gán: chỉ cần định nghĩa khi lớp dẫn xuất có biến mới là quản lý bộ nhớ
động (khi ko định nghĩa chúng ở class dẫn xuất, trình biên dịch tự động gọi các hàm đó ở lớp cơ sở
/ Hàm bạn thì không thừa hưởng được
/ Cơ chế đa hình: một đối tượng thuộc lớp cơ sở có thể quản lý đối tượng thuộc lớp dẫn xuất. Khi dùng đối tượng
này để gọi phương thức của lớp dẫn xuất => gọi phương thức của lớp cơ sở (liên kết 琁⤀nh). Muốn phái vỡ liên kết
琁⤀nh này (muốn gọi đến hàm của lớp dẫn xuất) => khai báo hàm của lớp cơ sở là ảo bằng từ khóa “virtual”.
/ Hàm thuần ảo, lớp thuần ảo:
// Hàm thuần ảo: là hàm ảo chỉ có khai báo, không có định nghĩa
// Lớp thuần ảo: chứa ít nhất 1 hàm thuần ảo
// Lớp thuần ảo trở thành dao diện (ko dùng được, không khai báo đối tượng được) => cần định nghĩa lớp dẫn xuất
để triển khai các phương thức thuần ảo trên.
Giúp tách phần khai báo và phần thực hiên, làm code dễ đọc, dễ phát triển
/ Hàm hủy là hàm ảo => có thử dùng con trỉ của lớp cơ sở để hủy đối tượng của lớp dẫn xuất / Các quyền thừa kế
// Quyền public: (class B: public A)
Public A trở thành public của B
Protected của A trở thành protected của B
Private của A thì B thừa hưởng được nhưng ko truy nhập (gọi thẳng, .) trực 琀椀 ếp đc
// Protected; (class B: protected A)
Public A trở thành protected của B (dùng trong nội bộ A, B và dẫn xuất của B)
Protected A trở thành protected của B (được dùng trong các lớp dẫn xuất của A và các lớp dẫn xuất của B)
Private của A thì B thừa hưởng được nhưng ko truy nhập (gọi thẳng, .) trực 琀椀 ếp đc // Private: (class B: A)
Tất cả public, protected của A thành private của B (chỉ được dùng trong B)
Private của A thì B thừa hưởng đc nhưng ko truy nhập trực 琀椀 ếp đc / Tương thích kiểu
// Đối tượng thuộc lớp dẫn xuất được sao chép cho đối tượng thuộc lớp cơ sở. Ngược lại thì ko đúng
// Con trỏ của lớp cơ sở quản lý đc đối tượng thuộc lớp dẫn xuất. Ngc lại ko đúng // Có thể ép kiểu Bài 1:
Xây dựng lớp Shape gồm 2 biến thành viên: color (string), 昀椀 lled (Boolean) và các hàm thành viên sau:
hàm tạo, hàm getColor, hàm setColor, hàm setFilled(), hàm isFilled, hàm getArea() thuần ảo, hàm
getPerimeter() thuần ảo.

Xây dựng lớp Circle là dẫn xuất với quyền public của lớp Shape, có thêm biến radius (double), có thêm
các hàm: getRadius(), setRadius, triển khai các hàm nh chu vi, diện ch
Định nghĩa lớp Rectangle có thêm biến width (double) và height (double) và các hàm: getWidth,
setWidth, getHeight, setHeight, nh chu vi và diện ch.
Viết chương trình sử dụng các lớp trên // Khai báo lớp Shape class Shape {
// Khai báo các biến thành viên protected:
string color; // Màu của hình
bool 昀椀 lled; // Được tô màu hay không public: // Hàm tạo mặc định Shape() { color = "red"; 昀椀 lled = true; } // Hàm tạo có tham số
Shape(string color, bool 昀椀
lled) { this->color = color;
this->昀椀 lled = 昀椀 lled; } // Hàm lấy màu string getColor() { return color; } // Hàm đặt màu void setColor(string color) { this->color = color; } // Hàm kiểm tra tô màu bool isFilled() { return 昀椀 lled; } // Hàm đặt tô màu
void setFilled(bool 昀椀 lled) {
this->昀椀 lled = 昀椀 lled; }
// Hàm 琀 nh diện 琀 ch thuần
ảo virtual double getArea() = 0;
// Hàm 琀 nh chu vi thuần ảo
virtual double getPerimeter() = 0; };
// Khai báo lớp Circle kế thừa từ lớp Shape
class Circle : public Shape { // Khai báo biến thành viên private:
double radius; // Bán kính của hình tròn public: // Hàm tạo mặc định Circle() : Shape() { radius = 1.0; } // Hàm tạo có tham số
Circle(double radius, string color, bool 昀椀 lled) : Shape(color, 昀椀 lled) { this->radius = radius; } // Hàm lấy bán kính double getRadius() { return radius; }
// Hàm đặt bán kính void setRadius(double radius) { this->radius = radius; } // Hàm 琀 nh diện 琀 ch double getArea() { return 3.14 * radius * radius;