C++ 多态

C++ 多态 首页 / C++入门教程 / C++ 多态

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

C++中有两种类型的多态性:

C++
  • 编译时多态性  -  通过匹配参数的类型和数量来调用重载函数。该信息在编译时可用,因此,编译器在编译时选择适当的函数。它是通过函数重载和运算符重载来实现的,也称为静态绑定或早期绑定。现在,让我们考虑一下函数名称和原型相同的情况。
class A                                 // 基类声明。
{
       int a;
       public:
       void display()
       { 
             cout<< "Class A ";
        }
x};
class B : public A                      // 派生类声明。
{
    int b;
    public:
    void display()
    {  
        cout<<"Class B";
    }
};

在上述情况下,基类和派生类中的display()函数原型相同。因此,不能应用静态绑定。如果在运行时选择了适当的函数,这称为运行时多态性

  • 运行时多态性   -  运行时多态性是在运行时而不是编译时调用对象的方法时实现的。它是通过方法重写(也称为动态绑定或后期绑定)来实现的。

编译Vs运行多态性。

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

运行时多态示例

让我们看一个简单的C++运行时多态性示例。

链接:https://www.learnfk.comhttps://www.learnfk.com/c++/cpp-polymorphism.html

来源:LearnFk无涯教程网

//没有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++中运行时多态的另一个示例,其中有两个派生类。

无涯教程网

//一个带有虚拟关键字的示例。

#include <iostream>  
using namespace std;  
class Shape {                                   // 基类
    public:  
virtual void draw(){                            // 虚函数
cout<<"drawing..."<<endl;    
    }      
};   
class Rectangle: public Shape                 // 继承 Shape 类。
{    
 public:  
 void draw()    
   {    
       cout<<"drawing rectangle..."<<endl;    
    }    
};  
class Circle: public Shape                       // 继承 Shape 类。

{    
 public:  
 void draw()    
   {    
      cout<<"drawing circle..."<<endl;    
   }    
};  
int main(void) {  
    Shape *s;                              // 基类指针。
    Shape sh;                              //基类对象。
    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 {                                //基类声明。
    public:  
    string color = "Black";    
};   
class Dog: public Animal                      //继承动物类。
{    
 public:  
    string color = "Grey";    
};  
int main(void) {  
     Animal d= Dog();    
    cout<<d.color;   
}  

输出:

Black

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

邱岳的产品手记 -〔邱岳〕

机器学习40讲 -〔王天一〕

Web协议详解与抓包实战 -〔陶辉〕

重学线性代数 -〔朱维刚〕

说透数字化转型 -〔付晓岩〕

徐昊 · TDD项目实战70讲 -〔徐昊〕

中间件核心技术与实战 -〔丁威〕

结构会议力 -〔李忠秋〕

Rust 语言从入门到实战 -〔唐刚〕

好记忆不如烂笔头。留下您的足迹吧 :)