在我看来,多态性在运行时对某些基类类型做了不同的事情。 至于过载也是今天首先听到的多态性,例如:
void A(int a){}
void A(int a, int b){}
为什么A
被称为静态多态?我只是想知道这个概念
是否还有虚拟表?
答案 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一起考虑时,它不是多态的形式。