个性化阅读
专注于IT技术分析

C++多态解析

本文概述

术语“多态性”是“多态” +“变形”的组合, 表示多种形式。这是一个希腊词。在面向对象的编程中, 我们使用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 ++运行时多态性示例。

//没有virtual关键字的示例。

#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
赞(0)
未经允许不得转载:srcmini » C++多态解析

评论 抢沙发

评论前必须登录!