Trong trường hợp lớp Engine không phải là lớp cơ sở trừu tượng của các lớp Car và PublicTransport, thì trong hàm khởi tạo của lớp Bus không cần gọi hàm khởi tạo của lớp

Một phần của tài liệu Bài giảng Ngôn ngữ lập trình C++: Phần 2 - TS. Nguyễn Duy Phương (Trang 32 - 36)

//Lớp cơ sở virtual

PublicTransport():Engine(){… }; };

class Bus: public Car, public PublicTransport{ public:

Gọi hàm khởi tạo tường minh của lớp cơ sở trừu tượng Bus():Engine(), Car(), PublicTransport(){… };

};

Lưu ý:

Trong trường hợp lớp Engine không phải là lớp cơ sở trừu tượng của các lớp Car và PublicTransport, thì trong hàm khởi tạo của lớp Bus không cần gọi hàm khởi tạo của lớp PublicTransport, thì trong hàm khởi tạo của lớp Bus không cần gọi hàm khởi tạo của lớp Engine, mà chỉ cần gọi tới các hàm khởi tạo của các lớp cơ sở trực tiếp của lớp Bus là lớp Car và lớp PublicTransport.

Chương trình 6.8 minh hoạ việc khai báo và sử dụng lớp cơ sở trừu tượng: lớp Engine là lớp cơ sở trừu tượng của các lớp Car và lớp PublicTransport. Hai lớp này, sau đó, lại làm lớp cơ sở của lớp trừu tượng của các lớp Car và lớp PublicTransport. Hai lớp này, sau đó, lại làm lớp cơ sở của lớp Bus. Chương trình 6.8 #include<stdio.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;}; // Khởi tạo không tham số Engine(int pIn){power = pIn;};// Khởi tạo đủ tham số void show(); // Giới thiệu float getPower(){return power;};

};

void Engine::show(){

cout << “This is an engine having a power of ” << power << “KWH” << endl; return;

}

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

int speed; // Tốc độ

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

public:

Car(); // Khởi tạo không tham số Car(int, int, char[], float); // Khởi tạo đủ tham số

void show(); // Giới thiệu float getSpeed(){return speed;};

char[] getMark(){return mark;}; float getPrice(){return price;}; };

Car::Car(): Engine(){ speed = 0; strcpy(mark, “”); price = 0;

// Khởi tạo không tham số

}

// Khởi tạo đủ tham số

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 << “ having a speed of ” speed << “km/h, its power is” << getPower() “KWh and price is $” << price << endl; return;

}

/* Định nghĩa lớp PublicTransport dẫn xuất trừu tượng từ lớp Engine */ class PublicTransport: public virtual Engine{ (adsbygoogle = window.adsbygoogle || []).push({});

float ticket; // Giá vé phương tiện public:

PublicTransport(); // Khởi tạo không tham số

PublicTransport(int, float); // Khởi tạo đủ tham số void show(); // Giới thiệu float getTicket(){return ticket;};

};

// Khởi tạo không tham số

PublicTransport::PublicTransport(): Engine(){ ticket = 0;

}

// Khởi tạo đủ tham số

PublicTransport::PublicTransport(int pwIn, float tIn): Engine(pwIn){ ticket = tIn;

}

// Giới thiệu

void PublicTransport::show(){

cout << “This is a public transport havìn a ticket of $” ticket << “ and its power is ” << getPower() “KWh” << endl;

return; }

/* Định nghĩa lớp Bus kế thừa từ lớp Car và PublicTransport */ class Bus: public Car, public PublicTransport{ // Thứ tự khai báo

int label; // Số hiệu tuyến xe public:

Bus(); // Khởi tạo không tham số

Bus(int,int,char[],float,float,int);// Khởi tạo đủ tham số void show(); // Giới thiệu

};

// Khởi tạo không tham số

Bus::Bus(): Engine(), Car(), Transport(){ // Theo thứ tự dẫn xuất label = 0;

}

// Khởi tạo đủ tham số

Bus::Bus(int pwIn, int sIn, char mIn[], float prIn, float tIn, int lIn): Engine(pwIn), Car(sIn, mIn, prIn), PublicTransport(tIn){ label = lIn;

}

// Giới thiệu void Bus::show(){

cout << “This is a bus on the line ” << label “, its speed is ” << getSpeed() “km/h, power is” << Car::getPower() “KWh, mark is ” << getMark() “, price is $” << getPrice()

“ and ticket is ” << getTicket() << endl; return;

}

// phương thức main void main(){ (adsbygoogle = window.adsbygoogle || []).push({});

clrscr();

Bus myBus(250, 100, “Mercedes”, 3000, 1.5, 27);

myBus.Car::Engine::show(); // Hàm của lớp Engine

myBus.PublicTransport::Engine::show();// Hàm của lớp Engine myBus.Car::show(); // Hàm của lớp Car myBus.PublicTransport:: show(); // Hàm của lớp PublicTransport myBus.show(); // Hàm của lớp Bus return;

}

Một phần của tài liệu Bài giảng Ngôn ngữ lập trình C++: Phần 2 - TS. Nguyễn Duy Phương (Trang 32 - 36)