Việc truy nhập đến các thành phần của các lớp trong đa kế thừa được dựa trên các nguyên tắc sau:
• Việc truy nhập từđối tượng lớp dẫn xuất đến các thành phần của mỗi lớp cơ sởđược tuân theo quy tắc phạm vi tương tự như trong đơn kế thừa.
• Trong trường hợp các lớp cơ sởđều có các thành phần cùng tên, việc truy xuất đến thành phần của lớp nào phải được chỉ rõ bằng toán tử phạm vi: “<Tên lớp>::” đối với thành phần lớp cơ sởđó.
Ví dụ, ta định nghĩa lớp Bus kế thừa từ hai lớp cơ sở: Car và PublicTransport. Nhưng cả ba lớp này đều định nghĩa một phương thức show() để tự giới thiệu:
class Car{ public: void show(); }; class PublicTransport{ public: void show(); };
class Bus: public Car, public PublicTransport{ public:
void show(); };
Khi đó, khai báo: Bus myBus; và lời gọi hàm: myBus.show(); // Gọi đến hàm của lớp Bus myBus.Car::show(); // Gọi đến hàm của lớp Car myBus.PublicTransport::show();// Gọi đến hàm của lớp PublicTransport
Chương trình 6.7 minh hoạ việc truy nhập đến các thành phần trùng nhau trong các lớp cơ sở và được định nghĩa lại trong lớp dẫn xuất. Chương trình 6.7 #include<stdio.h> #include<conio.h> #include<string.h> /* Định nghĩa lớp Car */ class Car{ 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, 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(){ // Khởi tạo không tham số speed = 0;
strcpy(mark, “”); price = 0;
}
// Khởi tạo đủ tham số
Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn;
strcpy(mark, markIn); price = priceIn;
// Giới thiệu void Car::show(){
cout << “This is a ” << mark << “ having a speed of ”
<< speed << “km/h and its price is $” << price << endl; return;
}
/* Định nghĩa lớp PublicTransport */ class PublicTransport{
float ticket; // Giá vé phương tiện public:
PublicTransport(); // Khởi tạo không tham số PublicTransport(float); // Khởi tạo đủ tham số
void show(); // Giới thiệu float getTicket(){return ticket;};
};
PublicTransport::PublicTransport(){ // Khởi tạo không tham số ticket = 0; } // Khởi tạo đủ tham số PublicTransport::PublicTransport(float ticketIn){ ticket = ticketIn; } // Giới thiệu void PublicTransport::show(){
cout << “This public transport had a ticket of $” << ticket << 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, char[], float, float, int);// Khởi tạo đủ tham số void show(); // Giới thiệu
};
Bus::Bus(): Car(), Transport(){ // Theo thứ tự dẫn xuất label = 0;
}
// Khởi tạo đủ tham số
Bus::Bus(int sIn, char mIn[], float pIn, float tIn, int lIn):
Car(sIn, mIn, pIn), PublicTransport(tIn){ // Theo thứ tự dẫn xuất label = lIn;
}
// Giới thiệu void Bus::show(){
cout << “This is a bus on the line ” << label << “, its speed is ” << getSpeed() << “km/h, mark is ” << getMark() << “, price is $” << getPrice()
<< “ and ticket is ” << getTicket() << endl; return;
}
// phương thức main void main(){
clrscr();
Bus myBus(100, “Mercedes”, 3000, 1.5, 27);
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; }
Chương trình 6.7 sẽ in ra thông báo như sau:
This is a Mercedes having a speed of 100km/h and its price is $3000 This public transport had a ticket of $1.5
This is a bus on the line 27, its speed is 100km/h, mark is Mercedes, price is $3000 and ticket is $1.5
Dòng thứ nhất là kết quả của phương thức show() của lớp Car, dòng thứ hai, tương ứng là kết quả phương thức show() của lớp PublicTransport, dòng thứ ba là kết quả phương thức show() của lớp Bus.