[OOP] Kế thừa (inheritance) trong C++

Kế thừa là 1 tính chất quan trọng trong lập trình hướng đối tượng. Cho phép ta định nghĩa 1 lớp mới có thể sử dụng (kế thừa) các thành phần của 1 class khác đã tồn tại.

Xem lại các tính chất của OOP trong bài giới thiệu vể lập trình hướng đối tượng.

Class được kế thừa gọi là lớp cơ sở (base class) hay lớp cha (parent class)

Class kế thừa được gọi là lớp dẫn suất (derived class) hay lớp con (child class).

Lớp dẫn suất (derived class) có thể kế thừa các biến thành viên, hàm thành viên không phải là private của lớp cơ sở (base class). Khi đó các biến và hàm đó trở thành biến thành viên và hàm thành viên của lớp dẫn suất.

Ví dụ:


//base class
class Person

{

private :

   string blood;

protected:

   string name;

   string address;

   int age;

public:

   string getName() const

   {

       return name;

   }

   string getAddress() const

   {

      return address;

   }

};

//derived class
class Employee : public Person

{

private:

   string empId;

   string department;

public:

   string getEmpId() const

   {

      return empId;

   }

   string getDepartment() const

   {

      return department;

   }

};

Ở ví dụ trên lớp Employee kế thừa từ class Person. Khi đó các thuộc tính name, address, age và hàm getName, getAddress cũng là thành viên của lớp Employee, còn thuộc tính bloodprivate nên không thể kế thừa. Ta có thể hiểu clas Employee viết đầy đủ như sau.


class Employee

{

private:

   string empId;

   string department;

protected:

   string name;

   string address;

   int age;

public:

   string getEmpId() const

   {

      return empId;

   }

   string getDepartment() const

   {

      return department;

   }

   string getName() const

   {

      return name;

   }

   string getAddress() const

   {

      return address;

   }

};

Hàm tạo (constructor) của lớp dẫn suất.

Khi ta tạo đối tượng của lớp cơ sở, constructor của lớp cơ sở được gọi.

Khi ta tạo đối tượng của lớp dẫn suất, constructor mặc định (constructor không có tham số) của lớp cơ sở sẽ được gọi trước, sau đó mới gọi đến constructor của lớp dẫn suất.

Khi hủy đối tượng của lớp dẫn suất, hàm hủy của lớp dẫn suất sẽ được gọi trước, sau đó sẽ gọi đến hàm hủy của lớp cơ sở.

Ví dụ:


#include <iostream>

#include <string>

using namespace std;

//base class
class Person

{

public:

   Person()

   {

      cout << "This is constructor base class" << endl;

   }

   ~Person()

   {

      cout << "This is destructor base class" << endl;

   }

};

//derived class
class Employee : public Person

{

public:

   Employee()

   {

      cout << "This is constructor derived class" << endl;

   }

   ~Employee()

   {

      cout << "This is destructor derived class" << endl;

   }

};

int main()

{

   Employee emp;

   return 0;

}

Kết quả:

This is constructor base class 
This is constructor derived class 
This is destructor derived class 
This is destructor base class

Chú ý:

Ta có thể thay đổi constructor của lớp cơ sở được gọi khi tạo đối tượng của lớp dẫn xuất bằng cách sử dụng initialization list.

Ví dụ:


//base class

class Person

{

protected:

   string name;

public:

   Person(string name)

   {

      this->name = name;

   }

};

//derived class
class Employee : public Person

{

private :

   string empId;

public:

   Employee(string empId, string name)
      : Person (name)

   {

      this->empId = empId;

   }

};

Ta không thể sử dụng initialization list cho biến thành viên của lớp cơ sở trong lớp dẫn suất.

Ví dụ:


class Employee : public Person

{

private :

   string empId;

public:

   Employee(string empId, string name)
      : name(name) // Error

   {
      //TODO
   }

};

Was this article helpful?

Leave A Comment?