为什么在c ++中调用函数/方法重载作为静态多态?

时间:2017-01-08 16:09:15

标签: c++ polymorphism overloading

在我看来,多态性在运行时对某些基类类型做了不同的事情。 至于过载也是今天首先听到的多态性,例如:

void A(int a){}
void A(int a, int b){}

为什么A被称为静态多态?我只是想知道这个概念 是否还有虚拟表?

1 个答案:

答案 0 :(得分:1)

多态性意味着,被调用者是在收到来自调用者的消息时决定如何做的人。

想一下“前进10米”的消息。如果被叫者是一个人,则该人通过步行这样做。如果被叫者是一辆汽车,那么汽车会转动它的车轮。

多态性的概念没有指定涉及哪些语言特征,或何时决定如何做。我们可以在运行时使用虚函数来完成它。我们可以在编译时(静态多态),使用函数重载,模板甚至邪恶的预处理器宏来完成它。

如果我们使用虚函数:

MovableObject* ptr = get_person();
ptr->go_forward(10);

MovableObject* ptr2 = get_car();
ptr2->go_forward(10);

如果我们使用函数重载:

void go_forward(Person& person, int distance);
void go_forward(Car& car, int distance);

并非所有函数重载都用作多态。

要通过重载演示静态多态,请考虑两个简单的程序。

// Program 1
int a;
int b;
std::cin >> a >> b;
int sum = a + b;
std::cout << sum;

// Program 2
double a;
double b;
std::cin >> a >> b;
double sum = a + b;
std::cout << sum;

等待。看起来它不涉及重载,是吗?

实际上,有超载。两个程序都涉及表达式a + b。他们都意味着我们的补充。但是有一点不同:程序1中的+被编译成整数加法的机器指令;程序2中的+被编译为浮点加法。两者都是附加物,但物理操作非常不同。

是否超载?是的,+已超载。

是多态吗?是的,对于这两种情况,+对调用者来说意味着相同的事情,并且底层操作是不同的。

现在考虑使用+

// Program 3
std::string a;
std::string b;
std::cin >> a >> b;
std::string sum = a + b;
std::cout << sum;

计划3也使用+。但它不再是添加了。它现在是字符串连接。

是否超载?是的,+已超载。

是多态吗?不,与程序1和2相比,现在意义不同。加法和连接是非常不同的事情。

另一个例子。

考虑标准库容器。

vector<int> my_vector;
begin(my_vector);

list<double> my_list;
begin(my_list);

是否超载?是的,begin已超载。

是多态吗?是的,begin的两个版本都返回指向第一个元素的迭代器,即使迭代器的类型不同。

这个怎么样?表示秒表的类和函数begin开始计算时间。

Stopwatch my_watch;
begin(my_watch);

是否超载?是的,begin已超载。

是多态吗?这次不行。这个begin不是为了获得迭代器。它只是启动秒表。意思不同,因此当与其他begin s一起考虑时,它不是多态的形式。