Ghi đè hàm trong C++

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 sẽ đượ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 <iostream>
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

Derived Function

Ở đây, hàm giống nhau print()được định nghĩa trong cả hai Basevà Derivedcá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.Thao tác ghi đè hàm trong C ++

Như chúng ta có thể thấy, hàm đã bị ghi đè bởi vì chúng ta đã gọi hàm từ một đối tượng của Derivedlớp.

Nếu chúng ta gọi print()hàm từ một đối tượng của Baselớp, thì hàm sẽ không bị ghi đè.

// Call function of Base class
Base base1;
base1.print(); // Output: Base Function

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 <iostream>
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

Derived Function
Base Function

Đây, tuyên bố này

derived2.Base::print();

truy cập print()chức năng của lớp Cơ sở.Truy cập hàm ghi đè bằng cách sử dụng đối tượng của lớp dẫn xuất trong C ++

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 <iostream>
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

Derived Function
Base Function

Trong chương trình này, chúng ta đã gọi hàm ghi đè bên trong Derivedchính lớp đó.

class Derived : public Base {
   public:
    void print() {
        cout << "Derived Function" << endl;
        Base::print();
    }
};

Lưu ý mã Base::print();, mã này gọi hàm được ghi đè bên trong Derivedlớp.Truy cập hàm ghi đè bên trong lớp dẫn xuất trong C ++

Ví dụ 4: Chức năng ghi đè cuộc gọi trong C ++ sử dụng con trỏ

// C++ program to access overridden function using pointer
// of Base type that points to an object of Derived class

#include <iostream>
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;

    // pointer of Base type that points to derived1
    Base* ptr = &derived1;

    // call function of Base class using ptr
    ptr->print();

    return 0;
}

Đầu ra

Base Function

Trong chương trình này, chúng ta đã tạo một con trỏ Basekiểu ptr . Con trỏ này trỏ đến Derivedđối tượng dẫn xuất1 .

// pointer of Base type that points to derived1
Base* ptr = &derived1;

Khi chúng ta gọi print()hàm bằng ptr , nó sẽ gọi hàm ghi đè từ Base.

// call function of Base class using ptr
ptr->print();

Điều này là do ngay cả khi ptr trỏ đến một Derivedđối tượng, nó thực sự thuộc Baseloại. Vì vậy, nó gọi hàm thành viên của Base.

Để ghi đè Basehàm thay vì truy cập nó, chúng ta cần sử dụng các hàm ảo trong Baselớp.









Gõ tìm kiếm nhanh...