[OOP] Các dạng kế thừa và hiding function

Các dạng kế thừa

Trong C++ có 3 dạng khác nhau của 1 class khi kế thừa đó là: public, protected, private.

class DerivedClass : public Base
{
   //TODO
}

class DerivedClass : protected Base
{
   //TODO
}

class DerivedClass : private Base
{
   //TODO
}

//Mặc định là private
class DerivedClass : Base
{
   //TODO
}

Phạm vi truy cập của các thành phần ở  Base class có thể thay đổi ở lớp dẫn suất (derived class) tùy theo từng dạng kế thừa.

Dạng kế thừa public

Phạm vi truy cập trong Base classPhạm vi truy cập trong lớp dẫn suất khi kế thừa public
publicpublic
protectedprotected
privateKhông thể truy cập

Ví dụ:


class Base

{

private:

   int m_private;

protected:

   int m_protected;

public:

   int m_public;

};

class Derived : public Base

{

public :

   Derived()

   {

      m_private = 1; //Error

      m_protected = 2; //OK

      m_public = 3;  //OK

   }

};

int main()

{

   Derived der;

   der.m_private = 3; //Error

   der.m_protected = 3; //Error

   der.m_public = 3; //OK

   return 0;

}

Dạng kế thừa protected

Phạm vi truy cập trong Base classPhạm vi truy cập trong lớp dẫn suất khi kế thừa protected
publicprotected
protectedprotected
privateKhông thể truy cập


class Base

{

private:

   int m_private;

protected:

   int m_protected;

public:

   int m_public;

};

class Derived : protected Base

{

public :

   Derived()

   {

      m_private = 1; //Error

      m_protected = 2; //OK

      m_public = 3;  //OK

   }

};

int main()

{

   Derived der;

   der.m_private = 3; //Error

   der.m_protected = 3; //Error

   der.m_public = 3; //Error vì biến public ở Base chuyển thành protected trong lớp dẫn suất khi kế thừa protected

   return 0;

}

Dạng kế thừa private

Phạm vi truy cập trong Base classPhạm vi truy cập trong lớp dẫn suất khi kế thừa private
publicprivate
protectedprivate
privateKhông thể truy cập


class Base

{

private:

   int m_private;

protected:

   int m_protected;

public:

   int m_public;

};

class Derived : private Base

{

public :

   Derived()

   {

      m_private = 1; //Error

      m_protected = 2; //OK

      m_public = 3;  //OK

   }

};

int main()

{

   Derived der;

   der.m_private = 3; //Error

   der.m_protected = 3; //Error vì biến protected ở Base chuyển thành private trong lớp dẫn suất khi kế thừa private

   der.m_public = 3; //Error vì biến public ở Base chuyển thành private trong lớp dẫn suất khi kế thừa private

   return 0;

}

Tổng kết

Phạm vi truy cập trong Base classPhạm vi truy cập trong lớp dẫn suất khi kế thừa publicPhạm vi truy cập trong lớp dẫn suất khi kế thừa protectedPhạm vi truy cập trong lớp dẫn suất khi kế thừa private
public publicprotectedprivate
protectedprotectedprotectedprivate
privateKhông thể truy cậpKhông thể truy cậpKhông thể truy cập

Thay đổi phạm vi truy cập ở lớp dẫn suất.

Trong C++ cho phép ta thay đổi phạm vi truy cập của các thành phần kế thừa trong Base class ở lớp dẫn suất bằng cách sử dụng câu lệnh using.

Ví dụ :


#include <iostream>

#include <string>

using namespace std;

class Base

{

protected:

   int m_val;

   void Display()

   {

      cout <<"m_val = " << m_val;

   }

};

class Derived : private Base

{

public :

   //Thay đổi biến m_val sang public
   using Base::m_val;

   //Thay đổi hàm Display sang pulbic
   using Base::Display;

};

int main()

{

   Derived der;

   der.m_val = 10;

   der.Display();

   return 0;

}

Kết quả:

m_val = 10

Hiding function

Trong lớp dẫn suất ta có thể ẩn (hide) function public trong Base class, không cho phép truy cập các function đó thông qua đối tượng của lớp dẫn suất.

  • Thay đổi phạm vi truy cập hàm đó sang private (sử dụng using).
  • Đánh dấu function đó là delete, Khi đó ta không thể gọi hàm.

#include <iostream>

using namespace std;

class Base

{

protected:

   int m_val;

public:

   void Display()

   {

      cout <<"m_val = " << m_val;

   }

};

class Derived : private Base

{

public :

   //Đánh dấu hàm Display là delete
   void Display() = delete;

};

int main()

{

   Derived der;
   
   der.Display(); //Error

   return 0;

}

Was this article helpful?

Leave A Comment?