gpt4 book ai didi

c++ - 为什么在 C++ 中将函数/方法重载称为静态多态性?

转载 作者:行者123 更新时间:2023-11-28 05:20:50 29 4
gpt4 key购买 nike

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

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

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

最佳答案

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

想想一条消息“前进 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中的+被编译为 float 加法。两者都是加法,但物理运算有很大不同。

是否重载?是的,+ 重载了。

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

现在考虑 + 的另一种用法。

// 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 一起考虑时,它不是多态的一种形式。

关于c++ - 为什么在 C++ 中将函数/方法重载称为静态多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41534730/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com