Trong hướng dẫn này, chúng ta sẽ tìm hiểu về ghi đè hàm trong C ++ với sự trợ giúp của các ví dụ.
Như chúng ta đã biết, kế thừa là một tính năng của OOP cho phép chúng ta tạo các lớp dẫn xuất từ một lớp cơ sở. Các lớp dẫn xuất kế thừa các tính năng của lớp cơ sở.
Giả sử, cùng một hàm được định nghĩa trong cả lớp dẫn xuất và lớp dựa trên. Bây giờ nếu chúng ta gọi hàm này bằng cách sử dụng đối tượng của lớp dẫn xuất, thì hàm của lớp dẫn xuất được thực thi.
Điều này được gọi là ghi đè hàm trong C ++. Hàm trong lớp dẫn xuất sẽ ghi đè hàm trong lớp cơ sở.
Ví dụ 1: Ghi đè hàm C ++
// C++ program to demonstrate function overriding #include using namespace std; class Base ( public: void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; ) ); int main() ( Derived derived1; derived1.print(); return 0; )
Đầu ra
Hàm có nguồn gốc
Ở đây, hàm giống nhau print()
được định nghĩa trong cả hai Base
và Derived
các lớp.
Vì vậy, khi chúng ta gọi print()
từ Derived
đối tượng có nguồn gốc1, print()
từ Derived
được thực thi bằng cách ghi đè hàm trong Base
.
![](https://cdn.wiki-base.com/1143898/c_function_overriding.png.webp)
Truy cập hàm ghi đè trong C ++
Để truy cập hàm bị ghi đè của lớp cơ sở, chúng ta sử dụng toán tử phân giải phạm vi ::
.
Chúng ta cũng có thể truy cập hàm bị ghi đè bằng cách sử dụng một con trỏ của lớp cơ sở để trỏ đến một đối tượng của lớp dẫn xuất và sau đó gọi hàm từ con trỏ đó.
Ví dụ 2: Hàm ghi đè truy cập C ++ vào lớp cơ sở
// C++ program to access overridden function // in main() using the scope resolution operator :: #include using namespace std; class Base ( public: void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; ) ); int main() ( Derived derived1, derived2; derived1.print(); // access print() function of the Base class derived2.Base::print(); return 0; )
Đầu ra
Hàm cơ sở hàm có nguồn gốc
Đây, tuyên bố này
derived2.Base::print();
truy cập vào print()
chức năng của lớp Cơ sở.
![](https://cdn.wiki-base.com/1143898/c_function_overriding_2.png.webp)
Ví dụ 3: Hàm ghi đè cuộc gọi trong C ++ từ lớp có nguồn gốc
// C++ program to call the overridden function // from a member function of the derived class #include using namespace std; class Base ( public: void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; // call overridden function Base::print(); ) ); int main() ( Derived derived1; derived1.print(); return 0; )
Đầu ra
Hàm cơ sở hàm có nguồn gốc
Trong chương trình này, chúng ta đã gọi hàm ghi đè bên trong Derived
chính lớp đó.
class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; Base::print(); ) );
Lưu ý đoạn mã Base::print();
gọi hàm ghi đè bên trong Derived
lớp.
![](https://cdn.wiki-base.com/1143898/c_function_overriding_3.png.webp)
Ví dụ 4: Chức năng ghi đè cuộc gọi trong C ++ bằng con trỏ
// C++ program to access overridden function using pointer // of Base type that points to an object of Derived class #include using namespace std; class Base ( public: void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function"
Output
Base Function
In this program, we have created a pointer of
Base
type named ptr. This pointer points to the Derived
object derived1.
// pointer of Base type that points to derived1 Base* ptr = &derived1;
When we call the
print()
function using ptr, it calls the overridden function from Base
.
// call function of Base class using ptr ptr->print();
This is because even though ptr points to a
Derived
object, it is actually of Base
type. So, it calls the member function of Base
.
In order to override the
Base
function instead of accessing it, we need to use virtual functions in the Base
class.