0
Tải bản đầy đủ (.pdf) (125 trang)

Định nghĩa la ̣i các thành viên

Một phần của tài liệu BÀI GIẢNG - LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ C++ PDF (Trang 78 -80 )

Mô ̣t vài thành viên (hàm hoặc dữ liệu) của lớp cơ sở có thể không phù hợp với lớp dẫn xuất. Các thành viên này nên được định nghĩa lại trong lớp dẫn xuất . Chẳng ha ̣n lớp Teacher có mô ̣t hàm thành viên in ra các thuô ̣c tính của cấc giáo viên lên màn hình. Nhưng hàm này là không đ ủ đối với lớp Principal vì các hiệu trưởng có nhiều thuô ̣c tính hơn các giáo viên bình thường. Vì thế hàm này sẽ được định nghĩa lại:

class Teacher{ protected:

String name;

int age, numOfStudents; public:

void setName(const String & new_name){name = new_name;} void print() const;

};

void Teacher::print() const{

cout << “Name: “ << name << “ Age: “ << age << endl; cout << “Number of Students: “ << numOfStudents << endl; };

76

String school_name; int numOfTeachers; public:

void setSchool(const & String s_name){school_name = s_name;} void print() const;

};

void Principal::print() const{

cout << “Name: “ << name << “ Age: “ << age << endl; cout << “Number of Students: “ << numOfStudents << endl; cout << “Name of the school: “ << school_name << endl; };

Hàm print () của lớp Principal override (hoă ̣c hide ) hàm print () của lớp Teacher . Lớp Principal giờ đây có hai hàm print (). Hàm print() của lớp cơ sở có thể được truy câ ̣p bằng cách sử du ̣ng toán tử “::”.

void Principal::print() const{ Teacher::print();

cout << “Name of the school: “ << school_name << endl; };

Chú ý: overloading khác với overriding . Nếu chúng ta thay đổi signature hoă ̣c kiểu trả về của một h àm thành viên thuộc lớp cơ sở thì lớp dẫn xuất sẽ có hai hàm thành viên có tên giống nhau nhưng đó không phải là overloading mà là overriding .

Và nếu như tác giả của lớp dẫn xuất định nghĩa lại một hàm thành viên , thì điều đó có nghĩa là họ muốn thay đổi giao diện của lớp cơ sở . Trong trườ ng hơ ̣p này hàm thành viên của lớp cơ sở sẽ bị che đi.

Ví dụ:

class A{ // Base class public:

int ia1,ia2; void fa1(); int fa2(int); };

class B: public A{ // Derived class public:

float ia1; // overrides ia1 float fa1(float); // overloads fa1 };

void A::fa1(){

cout << "fa1 of A has been called" << endl; }

int A::fa2(int i){

cout << "fa2 of A has been called" << endl; return i;

}

float B::fa1(float f){

77

return f; }

int main(){ B b;

int j=b.fa2(1); // A::fa2 b.ia1=4; // float fa1 of B

b.ia2=3; // ia2 of A. If it is public float y=b.fa1(3.14); // OK, fa1 of B is called

//b.fa1(); // ERROR! fa1 of B needs a floar argument b.A::fa1();

b.A::fa1(); b.A::ia1=1; return 0; }

Một phần của tài liệu BÀI GIẢNG - LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ C++ PDF (Trang 78 -80 )

×