Quy Tắc Gán Địa Chỉ Đối Tượng Cho Con Trỏ Lớp Cơ Sở


cin>>lc; switch(lc)

{

case 'a': cin.ignore(1);

cout<<"So bao danh:";cin.getline(bd,5); l.find_sbd(bd);

getch();break; case 'b': cin.ignore(1);

cout<<"Ho va ten:";cin.getline(ht,30); l.find_ten(ht);

getch();break; case 'c':

cout<<"Thi sinh co diem cao nhatn"; l.find_max();

getch();break; case 'd':

Có thể bạn quan tâm!

Xem toàn bộ 256 trang tài liệu này.

cout<<"Thi sinh co diem cao nhatn"; l.find_min();

getch();break;

Lập trình hướng đối tượng - 17

}

}

while(lc!='r'); break;

case 4:

cout<<"Nhap thong tin thi sinh can bo sungn"; cin>>x;

l.add(x); break;

case 5:

cout<<"Nhap so bao dand cua thi sinh can loai bon"; cin.ignore(1);


cin>>bd; l.remove(bd); break;

case 6:

l.sort_asc(); break;

case 7:

cout<<"Diem chuan:";cin>>diemchuan; kq=l.xettuyen_diem(diemchuan); kq.display();

getch();

}

}

while (chon!=8);

}


3.10.5. Quy tắc gán địa chỉ đối tượng cho con trỏ lớp cơ sở

Con trỏ đối tượng cđa lớp cơ sở không những có thể chứa địa chỉ cđa đối tượng thuộc lớp đó, nó còn có thể chứa địa chỉ cđa đối tượng cđa lớp dẫn xuất. Trong ví dụ 3.15, các con trỏ se[0], se[1] không những có thể chứa địa chỉ đối tượng cđa lớp search (hiển nhiên), còn có thể chứa địa chỉ đối tượng cđa lớp dẫn xuất sequential_search được thể hiện qua các câu lệnh:

search *se[2];//khai báo mảng con trỏ lớp cơ sở search

sequential_search s_search;//khai báo đối tượng cđa lớp sequential_ search se[0] = &s_search;//gán địa chỉ cho con trỏ lớp cơ sở

và có thể chứa địa chỉ đối tượng lớp dẫn xuất binary_search, thể hiện qua các câu lệnh:

search *se[2];//khai báo mảng con trỏ lớp cơ sở search

binary_search b_search;//khai báo đối tượng cđa lớp dẫn xuất binary_search se[1] = &b_search;//gán địa chỉ cho con trỏ lớp cơ sở


3.11. 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 có đối tượng nào cđa lớp cơ sở 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. Chẳng hạn xét sơ đồ thừa kế sau

Car

Public

Engine


Sơ đồ 3.3


Trong sơ đồ này lớp Engine là lớp cơ sở trừu trượng được dùng để xây dựng lớp Car và lớp PublicTransport.

Lớp cơ sở trừu tượng đặc biệt áp dụng cho các lớp có các phương thức ảo thuần tuý. Phương thức ảo thuần tuý là phương thức ảo mà nội dung không có gì. Cách định nghĩa phương thức ảo thuần tuý như sau :

virtual void tên_phương_thức() = 0 ; Ví dụ 3.17 :

#include<iostream.h>

#include<conio.h>

#include<string.h>

/* Định nghĩa lớp Engine */ class Engine

{

int power; // Công suất public: Engine(){power = 0;};

Engine(int pIn){power = pIn;};

virtual void show()=0; // phương thức ảo thuần tuý float getPower(){return power;};

};

/* Định nghĩa lớp Car dẫn xuất từ lớp cơ sở trừu tượng Engine*/ class Car: public Engine

{

int speed; // Tốc độ


char mark[20]; // Nhãn hiệu float price; // Giá xe

public:

Car();

Car(int, int, char[], float); void show(); // Giới thiệu

float getSpeed(){return speed;}; char *getMark(){return mark;}; float getPrice(){return price;};

};

Car::Car(): Engine()// Khởi tạo không tham số

{

speed = 0; strcpy(mark,"Oto"); price = 0;

}

Car::Car(int pwIn, int sIn, char mIn[], float prIn): Engine(pwIn)

{

speed = sIn; strcpy(mark, mIn); price = prIn;

}

void Car::show()

{

cout<<"This is a:" << mark;

cout<<"nHaving a speed of:" <<speed<<"km/h"; cout<<"nIts power is:"<<getPower()<<"KWh"; cout<<"nAnd Price is:" <<price <<"$"<<endl; return;

}

class PublicTransport: public Engine

{

float ticket;


public:

PublicTransport();

PublicTransport(int, float); void show();

float getTicket(){return ticket;};

};

PublicTransport::PublicTransport(): Engine()

{

ticket = 0;

}

PublicTransport::PublicTransport(int pwIn, float tIn): Engine(pwIn)

{

ticket = tIn;

}

void PublicTransport::show()

{

cout<<"This is a public transport having a ticket of:"<<ticket<<"$"; cout<<"nAnd its power is:"<< getPower()<< "KWh" << endl; return;

}

void main()

{

clrscr();

Car myCar(250, 100, "Mercedes", 1.5); myCar.show();

PublicTransport myTrans(250, 0.2); myTrans.show();

getch();

}

Chương trình sẽ in ra thông báo như sau: This is a: Mercedes

Having a speed of: 100km/h Its power is: 250KWh


And price is: 1.5$

This is a public transport having a ticket of: 0.2$ And its power is: 250KWh


Câu hỏi và bài tập

1. Trong các khai báo sau, khai báo nào là đúng cú pháp khai báo lớp dẫn xuất:

a. class A: public class B{};

b. class A: public B{};

c. class A: class B{};

d. class A:: public B{};

2. Trong các kiểu dẫn xuất sau, kiểu dẫn xuất nào từ các phương thức lớp dẫn xuất, không thể truy nhập đến các thành phần private cđa lớp cơ sở:

a. private

b. protected

c. public

d. Cả ba kiểu trên

3. Trong các kiểu dẫn xuất sau, kiểu dẫn xuất nào từ đối tượng cđa lớp dẫn xuất, có thể truy nhập đến các thành phần cđa lớp cơ sở:

a. private

b. protected

c. public

d. Cả ba kiểu trên

4. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử có các kiểu khai báo: A myA, *ptrA;

B myB, *ptrB;

khi đó, các lệnh nào sau đây là không có lỗi:

a. myA = myB;

b. myB = myA;

c. ptrA = &myB;

d. ptrB = &myA;

e. ptrA = ptrB;

f. ptrB = ptrA;

5. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử có các kiểu khai báo và nguyên mẫu hàm:

A myA;

B myB;


void show(A, B);

khi đó, các lời gọi nào sau đây là không có lỗi:

a. show(myA, myA);

b. show(myA, myB);

c. show(myB, myA);

d. show(myB, myB);

6. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử B có một hàm tạo: B(int, float);

khi đó, khai báo hàm tạo nào sau đây cđa lớp A là chấp nhận được: a. A::A(){};

b. A::A(): B(){};

c. A::A(int x, float y): B(){};

d. A::A(int x, float y): B(x, y){};

7. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử B có hai hàm tạo: B();

B(int, float);

khi đó, những khai báo hàm tạo nào sau đây cđa lớp A là chấp nhận được: a. A::A(){};

b. A::A(): B(){};

c. A::A(int x, float y): B(){};

d. A::A(int x, float y): B(x, y){};

8. A là lớp dẫn xuất public từ lớp cơ sở B. Giả sử B có hàm huỷ tường minh:

~B();

khi đó, những khai báo hàm huỷ nào sau đây cđa lớp A là chấp nhận được: a. A::~A(){};

b. A::~A(): ~B(){};

c. A::~A(int x){};

d. A::~A(int x): ~B(){};

9. Giả sử B là một lớp được khai báo: class B

{

int x;

public: int getx();

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 03/07/2022