什么是多态
答:所谓多态,就是同一个函数名具有多种状态,或者说一个接口具有不同的行为;C++的多态分为编译时多态和运行时多态,编译时通过重载和模板来实现,运行时多态称为动态联编,通过继承和虚函数来实现。
静态多态(编译期/早绑定)
函数重载
class A
{
public:void do(int a);void do(int a, int b);
};
动态多态(运行期期/晚绑定)
- 虚函数:用 virtual 修饰成员函数,使其成为虚函数
- 动态绑定:当使用基类的引用或指针调用一个虚函数时将发生动态绑定
注意:
- 可以将派生类的对象赋值给基类的指针或引用,反之不可
- 普通函数(非类成员函数)不能是虚函数
- 静态函数(static)不能是虚函数
- 构造函数不能是虚函数(因为在调用构造函数时,虚表指针并没有在对象的内存空间中,必须要构造函数调用完成后才会形成虚表指针)
- 内联函数不能是表现多态性时的虚函数,解释见:虚函数(virtual)可以是内联函数(inline)吗?
动态多态使用
class Shape // 形状类
{
public:virtual double calcArea(){...}virtual ~Shape();
};
class Circle : public Shape // 圆形类
{
public:virtual double calcArea();...
};
class Rect : public Shape // 矩形类
{
public:virtual double calcArea();...
};
int main()
{Shape * shape1 = new Circle(4.0);Shape * shape2 = new Rect(5.0, 6.0);shape1->calcArea(); // 调用圆形类里面的方法shape2->calcArea(); // 调用矩形类里面的方法delete shape1;shape1 = nullptr;delete shape2;shape2 = nullptr;return 0;
}