Trong hướng dẫn này, chúng ta sẽ tìm hiểu về tính đa hình trong C ++ với sự trợ giúp của các ví dụ.
Đa hình là một khái niệm quan trọng của lập trình hướng đối tượng. Nó chỉ đơn giản có nghĩa là nhiều hơn một hình thức. Nghĩa là, cùng một thực thể (chức năng hoặc toán tử) hoạt động khác nhau trong các tình huống khác nhau. Ví dụ,
Các +
nhà điều hành trong C ++ được sử dụng để thực hiện hai chức năng cụ thể. Khi nó được sử dụng với các số (số nguyên và số dấu phẩy động), nó sẽ thực hiện phép cộng.
int a = 5; int b = 6; int sum = a + b; // sum = 11
Và khi chúng ta sử dụng +
toán tử với chuỗi, nó thực hiện nối chuỗi. Ví dụ,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Chúng ta có thể triển khai tính đa hình trong C ++ bằng các cách sau:
- Quá tải chức năng
- Người vận hành quá tải
- Ghi đè hàm
- Chức năng ảo
Nạp chồng hàm trong C ++
Trong C ++, chúng ta có thể sử dụng hai hàm có cùng tên nếu chúng có các tham số khác nhau (kiểu hoặc số lượng đối số).
Và, tùy thuộc vào số lượng / kiểu đối số, các hàm khác nhau được gọi. Ví dụ,
// C++ program to overload sum() function #include using namespace std; // Function with 2 int parameters int sum(int num1, int num2) ( return num1 + num2; ) // Function with 2 double parameters double sum(double num1, double num2) ( return num1 + num2; ) // Function with 3 int parameters int sum(int num1, int num2, int num3) ( return num1 + num2 + num3; ) int main() ( // Call function with 2 int parameters cout << "Sum 1 = " << sum(5, 6) << endl; // Call function with 2 double parameters cout << "Sum 2 = " << sum(5.5, 6.6) << endl; // Call function with 3 int parameters cout << "Sum 3 = " << sum(5, 6, 7) << endl; return 0; )
Đầu ra
Tổng 1 = 11 Tổng 2 = 12,1 Tổng 3 = 18
Ở đây, chúng ta đã tạo 3 sum()
hàm khác nhau với các tham số khác nhau (số lượng / kiểu tham số). Và, dựa trên các đối số được truyền trong một lệnh gọi hàm, một đối số cụ thể sum()
được gọi.
Đó là một đa hình thời gian biên dịch vì trình biên dịch biết hàm nào sẽ thực thi trước khi chương trình được biên dịch.
Để tìm hiểu thêm, hãy truy cập hướng dẫn Nạp chồng hàm C ++ của chúng tôi.
Nạp chồng toán tử C ++
Trong C ++, chúng ta có thể nạp chồng một toán tử miễn là chúng ta đang hoạt động trên các kiểu do người dùng định nghĩa như đối tượng hoặc cấu trúc.
Chúng ta không thể sử dụng toán tử quá tải với nhiều loại cơ bản như int
, double
vv
Nạp chồng toán tử về cơ bản là nạp chồng hàm, trong đó các hàm toán tử khác nhau có cùng ký hiệu nhưng các toán hạng khác nhau.
Và, tùy thuộc vào các toán hạng, các hàm toán tử khác nhau được thực thi. Ví dụ,
// C++ program to overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++() ( value = value + 1; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++()" function ++count1; count1.display(); return 0; )
Đầu ra
Đếm: 6
Ở đây, chúng ta đã nạp chồng ++
toán tử, toán tử này hoạt động trên các đối tượng của Count
lớp (đối tượng count1 trong trường hợp này).
Chúng tôi đã sử dụng toán tử được nạp chồng này để tăng trực tiếp biến giá trị của đối tượng count1 lên 1
.
Đây cũng là một đa hình thời gian biên dịch .
Để tìm hiểu thêm, hãy truy cập hướng dẫn Nạp chồng toán tử C ++ của chúng tôi.
Ghi đè hàm C ++
Trong kế thừa C ++, chúng ta có thể có cùng một hàm trong lớp cơ sở cũng như các lớp dẫn xuất của nó.
Khi chúng ta gọi hàm bằng cách sử dụng một đố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 thay vì hàm trong lớp cơ sở.
Vì vậy, các hàm khác nhau được thực thi tùy thuộc vào đối tượng gọi hàm.
Điều này được gọi là ghi đè hàm trong C ++. Ví dụ,
// C++ program to demonstrate function overriding #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; ) ); int main() ( Derived derived1; // Call print() function of Derived class derived1.print(); return 0; )
Đầu ra
Hàm có nguồn gốc
Ở đây, chúng ta đã sử dụng một print()
hàm trong Base
lớp và cùng một hàm trong Derived
lớp
Khi chúng ta gọi print()
bằng cách sử dụng Derived
đối tượngced1, nó sẽ ghi đè print()
chức năng của Base
bằng cách thực thi print()
chức năng của Derived
lớp.
Đó là một đa hình thời gian chạy vì lệnh gọi hàm không được trình biên dịch giải quyết, nhưng thay vào đó nó được giải quyết trong thời gian chạy.
Để tìm hiểu thêm, hãy truy cập hướng dẫn Ghi đè hàm C ++ của chúng tôi.
Các hàm ảo trong C ++
Trong C ++, chúng ta có thể không ghi đè các hàm nếu chúng ta 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.
Việc sử dụng các hàm ảo trong lớp cơ sở đảm bảo rằng hàm có thể được ghi đè trong những trường hợp này.
Vì vậy, các chức năng ảo thực sự thuộc về ghi đè chức năng . Ví dụ,
// C++ program to demonstrate the use of virtual functions #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function"
Output
Derived Function
Here, we have used a virtual function
print()
in the Base
class to ensure that it is overridden by the function in the Derived
class.
Virtual functions are runtime polymorphism.
To learn more, visit our C++ Virtual Functions tutorial.
Why Polymorphism?
Polymorphism allows us to create consistent code. For example,
Suppose we need to calculate the area of a circle and a square. To do so, we can create a
Shape
class and derive two classes Circle
and Square
from it.
In this case, it makes sense to create a function having the same name
calculateArea()
in both the derived classes rather than creating functions with different names, thus making our code more consistent.