多态:一个接口, 多种方法。程序在运行时才决定调用的函数是什么。
C++多态通过 虚函数实现, 虚函数允许子类重新定义成员函数, 子类override父类。
多态与非多态的实质区别:函数地址是早绑定还是晚绑定。
早绑定:函数的调用, 在编译器编译期间就可以确定函数的调用地址, 并且产生代码, 即为静态的, 就是早绑定。
晚绑定:运行时决定函数地址, 即为动态的, 就是晚绑定。
代码实例:
#include <iostream>
#include <cstdio>
using namespace std;
class A {
public:
void foo() {
printf("1\n");
}
virtual void fun() {
printf("2\n");
}
};
class B : public A {
public:
void foo() {
printf("3\n");
}
void fun() {
printf("4\n");
}
};
int main(void) {
A a;
B b;
A *p = &a;
p->foo();
p->fun();
p = &b;
p->foo();
p->fun();
B *ptr = (B *)&a;
ptr->foo();
ptr->fun();
return 0;
}
代码结果:
1 2 1 4 3 2
纯虚函数:
将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
多态性
指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。
a、编译时多态性:通过重载函数实现
b、运行时多态性:通过虚函数实现。