C++教程
C++控制语句
C++函数
C++数组
C++指针
C++对象
C++继承
C++多态
C++抽象
C++常用
C++ STL教程
C++迭代器
C++程序

C++多态性

术语"多态性"是"poly" + "morphs"的组合,表示多种形式。这是一个希腊词。在面向对象的程序设计中,我们使用3个主要概念: 继承,封装和多态性。

多态性的真实示例

让我们考虑一个真实的示例多态性。一位女士的行为就像教室里的老师,家里的母亲或女儿以及市场上的客户一样。在这里,一个人的行为会根据情况而有所不同。
C++中有两种类型的多态性:
C++ 编译时多态性: 通过匹配参数的类型和数量来调用重载函数。此信息在编译时可用,因此,编译器在编译时选择适当的函数。它是通过函数重载和运算符重载来实现的,也称为静态绑定或早期绑定。现在,让我们考虑一下函数名称和原型相同的情况。
   class A                                  //  base class declaration.
  {
       int a;
       public:
       void display()
       { 
             cout<< "class A ";
        }
  };
class B : public A                       //  derived class declaration.
{
    int b;
    public:
   void display()
  {
        cout<<"class B";
  }
};
在上述情况下,基类和派生类中的display()函数原型相同。因此,不能应用静态绑定。如果在运行时选择了适当的功能,那就太好了。这就是运行时多态性。
运行时多态性: 运行时多态性是在运行时而不是编译时调用对象的方法时实现的。它是通过方法重写(也称为动态绑定或后期绑定)来实现的。

编译时间和运行时多态性差异。

编译时多态性 运行时多态性
在编译时就知道要调用的函数。 要在运行时知道要调用的函数。
也称为重载,早期绑定和静态绑定。 也称为覆盖,动态绑定和后期绑定。
重载是一种编译时多态,其中多个方法具有相同的名称,但参数数量或参数类型不同。 重载是一种运行时多态,其中多个方法具有相同的名称,参数数量和参数类型。
通过函数重载和运算符重载来实现。 它是通过虚函数和指针实现的。
它提供了编译时所知道的快速执行。 它提供了运行时所知道的缓慢执行。
它的灵活性较差,因为主要是所有事物在编译时执行。 它更灵活,因为所有事情都在运行时执行。

C++运行时多态性示例

让我们看一个简单的C++运行时多态性示例。
//没有虚拟关键字的示例
#include <iostream>  
using namespace std;  
class Animal {  
    public:  
void eat(){    
cout<<"Eating...";    
    }      
};   
class Dog: public Animal    
{    
 public:  
 void eat()    
    {           cout<<"Eating bread...";    
    }    
};  
int main(void) {  
   Dog d = Dog();    
   d.eat();  
   return 0;  
}  
输出:
Eating bread...

C++运行时多态性示例: 通过使用两个派生类

让我们看一下C++中运行时多态性的另一个示例,其中有两个派生类。
//一个带有虚拟关键字的示例。
#include <iostream>  
using namespace std;  
class Shape {                                        //  base class
    public:  
virtual void draw(){                             // virtual function
cout<<"drawing..."<<endl;    
    }      
};   
class Rectangle: public Shape                  //  inheriting Shape class.
{    
 public:  
 void draw()    
   {    
       cout<<"drawing rectangle..."<<endl;    
    }    
};  
class Circle: public Shape                        //  inheriting Shape class.
{    
 public:  
 void draw()    
   {    
      cout<<"drawing circle..."<<endl;    
   }    
};  
int main(void) {  
    Shape *s;                               //  base class pointer.
    Shape sh;                               // base class object.
       Rectangle rec;  
        Circle cir;  
      s=&sh;  
     s->draw();   
        s=&rec;  
     s->draw();    
    s=?  
    s->draw();   
}  
输出:
drawing...
drawing rectangle...
drawing circle...

具有数据成员的运行时多态性

运行时多态性可以通过C++中的数据成员来实现。让我们来看一个示例,其中我们通过引用变量访问字段,该引用变量引用派生类的实例。
#include <iostream>  
using namespace std;  
class Animal {                                          //  base class declaration.
    public:  
    string color = "Black";    
};   
class Dog: public Animal                       // inheriting Animal class.
{    
 public:  
    string color = "Grey";    
};  
int main(void) {  
     Animal d= Dog();    
    cout<<d.color;   
}  
输出:
Black
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4