C++多态解析

本文概述

  • 多态性的现实例子
  • 黑白差异编译时间和运行时多态性。
  • C ++运行时多态示例
  • C ++运行时多态示例:通过使用两个派生类
  • 数据成员的运行时多态
【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

    推荐阅读