C++多态性

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

多态性的真实生活例子

让我们考虑一个多态性的真实生活例子。一个女士在教室中表现得像一位老师,在家中像母亲或女儿,在市场中像一个顾客。在这里,一个人根据情况的不同而表现得不同。

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

1.png

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

// 使用virtual关键字的示例代码。

#include <iostream>
using namespace std;
class Shape { // 基类
public:
virtual void draw(){ // 虚函数
cout<<"绘制中..."<<endl;
}
};
class Rectangle: public Shape // 继承自Shape类
{
public:
void draw() {
cout<<"绘制矩形..."<<endl;
}
};
class Circle: public Shape // 继承自Shape类
{
public:
void draw() {
cout<<"绘制圆形..."<<endl;
}
};
int main(void) {
Shape *s; // 基类指针
Shape sh; // 基类对象
Rectangle rec;
Circle cir;
s = &sh;
s->draw();
s = &rec;
s->draw();
s = ○
s->draw();
}

输出结果:

绘制中... 
绘制矩形... 
绘制圆形...

使用数据成员实现运行时多态性

在C++中,可以通过数据成员实现运行时多态性。让我们看一个例子,其中我们通过引用变量访问字段,该引用变量指向派生类的实例。

#include <iostream>
using namespace std;
class Animal { // 基类声明
public:
string color = "黑色";
};
class Dog: public Animal // 继承自Animal类
{
public:
string color = "灰色";
};
int main(void) {
Animal d = Dog();
cout<<d.color;
}

输出结果:

黑色

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想