“多态性”(polymorphism)一词意味着具有多种形式。 简单来说,我们可以将多态性定义为消息以多种形式展示的能力。
多态性的一个真实例子是一个人可以同时具有不同的特征。 男人同时是父亲、丈夫和雇员。 所以同一个人在不同的情况下会表现出不同的行为。 这称为多态性。 多态性被认为是面向对象编程的重要特征之一。
多态性的类型
- 编译时的多态性
- 运行时的多态性
编辑
1.编译时多态性
这种类型的多态性是通过函数重载或运算符重载来实现的。
A. 函数重载
当有多个同名但参数不同的函数时,这些函数被称为 重载, 因此这被称为函数重载。 来重载函数 可以通过更改参数数量 或/和 更改参数类型 。 简单来说,它是面向对象编程的一个特点,当许多任务列在一个函数名称下时,它提供许多具有相同名称但不同参数的函数。 某些 函数重载规则,重载函数时应遵循
下面是显示函数重载或编译时多态性的 C++ 程序:
// C++ program to demonstrate // function overloading or // Compile-time Polymorphism #include <bits/stdc++.h> using namespace std; class Geeks { public: // Function with 1 int parameter void func(int x) { cout << "value of x is " << x << endl; } // Function with same name but // 1 double parameter void func(double x) { cout << "value of x is " << x << endl; } // Function with same name and // 2 int parameters void func(int x, int y) { cout << "value of x and y is " << x << ", " << y << endl; } }; // Driver code int main() { Geeks obj1; // Function being called depends // on the parameters passed // func() is called with int value obj1.func(7); // func() is called with double value obj1.func(9.132); // func() is called with 2 int values obj1.func(85, 64); return 0; }
输出
value of x is 7 value of x is 9.132 value of x and y is 85, 64
解释: 在上面的例子中,一个名为 function func() 的函数在三种不同的情况下表现不同,这是多态性的一个特性。
B. 运算符重载
C++ 能够为运算符提供对数据类型的特殊含义,这种能力称为运算符重载。 例如,我们可以使用字符串类的加法运算符 (+) 来连接两个字符串。 我们知道这个运算符的任务是将两个操作数相加。 因此,单个运算符“+”,当放在整数操作数之间时,将它们相加,当放在字符串操作数之间时,将它们连接起来。
下面是演示运算符重载的 C++ 程序:
// C++ program to demonstrate // Operator Overloading or // Compile-Time Polymorphism #include <iostream> using namespace std; class Complex { private: int real, imag; public: Complex(int r = 0, int i = 0) { real = r; imag = i; } // This is automatically called // when '+' is used with between // two Complex objects Complex operator+(Complex const& obj) { Complex res; res.real = real + obj.real; res.imag = imag + obj.imag; return res; } void print() { cout << real << " + i" << imag << endl; } }; // Driver code int main() { Complex c1(10, 5), c2(2, 4); // An example call to "operator+" Complex c3 = c1 + c2; c3.print(); }
输出
12 + i9
解释: 在上面的例子中,运算符'+'被重载了。 通常,此运算符用于将两个数(整数或浮点数)相加,但此处使该运算符执行两个虚数或复数的相加。
2. 运行时多态性
这种类型的多态性是通过 Function Overriding 实现的。 后期绑定和动态多态是运行时多态的其他名称。 函数调用在运行时 多态性 中在运行时解析。 相反,对于编译时多态性,编译器在运行时推导后确定将哪个函数调用绑定到对象。
A. 函数覆盖
当派生类具有基类的成员函数之一的定义时,就会发生函数覆盖。 据说该基本功能已被覆盖。
编辑
下面是演示函数覆盖的 C++ 程序:
// C++ program for function overriding #include <bits/stdc++.h> using namespace std; class base { public: virtual void print() { cout << "print base class" << endl; } void show() { cout << "show base class" << endl; } }; class derived : public base { public: // print () is already virtual function in // derived class, we could also declared as // virtual void print () explicitly void print() { cout << "print derived class" << endl; } void show() { cout << "show derived class" << endl; } }; // Driver code int main() { base* bptr; derived d; bptr = &d; // 虚函数绑定在 // 运行时 (Runtime polymorphism) bptr->print(); // 非虚函数绑定在 // 编译时 bptr->show(); return 0; }
输出
print derived class show base class
虚函数
一个虚函数是 在基类中使用关键字virtual声明并在派生类中重新定义(Overridden)的成员函数。
关于虚函数的一些要点:
*虚函数本质上是动态的。 *插入关键字“ virtual ”来定义的,并且总是用基类声明并在子类中被覆盖 它们是通过在基类中 *在运行时调用虚函数
下面是演示虚函数的C++程序:
// C++ Program to demonstrate // the Virtual Function #include <iostream> using namespace std; // Declaring a Base class class GFG_Base { public: // virtual function virtual void display() { cout << "Called virtual Base Class function" << "\n\n"; } void print() { cout << "Called GFG_Base print function" << "\n\n"; } }; // Declaring a Child Class class GFG_Child : public GFG_Base { public: void display() { cout << "Called GFG_Child Display Function" << "\n\n"; } void print() { cout << "Called GFG_Child print Function" << "\n\n"; } }; // Driver code int main() { // Create a reference of class GFG_Base GFG_Base* base; GFG_Child child; base = &child; // This will call the virtual function base->GFG_Base::display(); // this will call the non-virtual function base->print(); }
输出
Called virtual Base Class function Called GFG_Base print function