本文概述
- 多态性的现实例子
- 黑白差异编译时间和运行时多态性。
- C ++运行时多态示例
- 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()函数的原型都是相同的。因此, 无法应用静态绑定。如果在运行时选择了适当的功能, 那就太好了。这称为运行时多态。
- 运行时多态性:当在运行时而不是编译时调用对象的方法时, 可以实现运行时多态。它是通过方法覆盖(也称为动态绑定或后期绑定)来实现的。
编译时多态 | 运行时多态 |
---|---|
在编译时就知道要调用的函数。 | 在运行时已知要调用的功能。 |
也称为重载, 早期绑定和静态绑定。 | 也称为覆盖, 动态绑定和后期绑定。 |
重载是一种编译时多态, 其中一种以上的方法具有相同的名称, 但参数数量或参数类型不同。 | 覆盖是一种运行时多态性, 其中有多个方法具有相同的名称, 参数数量和参数类型。 |
它是通过函数重载和操作符重载来实现的。 | 它是通过虚拟函数和指针实现的。 |
它提供了编译时所知道的快速执行。 | 它提供了运行时所知的缓慢执行。 |
它的灵活性较差, 因为主要所有事物都在编译时执行。 | 由于所有事情都在运行时执行, 因此它更加灵活。 |
//没有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