这里写目录标题
四种多态
- 重载多态:函数重载,运算符重载
- 强制多态:4种强制类型转换 static_cast const_cast
- 包含多态: virtual多态
- 参数多态:函数模板
编译时多态
通过函数的重载和运算符的重载来实现
在编译的时候,当编译器看到Max(2,3)时,就和 int Max(int x,int y);这个函数联系在一起了,所以这个又叫做早期捆绑/早期连编
运行时多态
运行时多态:程序在执行前,无法根据函数名和参数来决定要调用哪一个函数,必须在程序执行的过程中**,根据程序执行的具体情况**动态的确定,它是通过类继承关系public和虚函数来实现的,目的也是建立一种通用的程序。
实现运行时绑定:
1.两个类必须有继承关系
2.要动态绑定的函数在基类中必须为虚函数,且派生类与基类中该函数必须同名同参
3.必须是基类的指针或者引用指向基类或派生类对象。
值传递不能实现运行时多态
指针和引用可以实现运行时多态
该函数不为虚函数的话无法实现动态绑定
调用派生类中扩展的函数
调用派生类中未重写的该函数
因为派生类在继承时也把fh也同时继承过来了,但是因为它没有重写,所以这也没有啥意义
子类覆盖时也可以不加关键字virtual
虚函数的默认缺省参数是静态绑定的,在重新定义虚函数时,不重写定义继承过来的虚函数的默认缺省参数。
不过在调用时传递实际的参数是不影响的。
多继承也可以实现动态连编
动态绑定原理
class Shape
{
public:
void virtual draw() = 0;
};
class c :public Shape
{
public:
void draw() { std::cout << c::draw << std::endl; }
};
class r :public Shape
{
public:
void draw() { std::cout << r::draw << std::endl; }
};
class t :public Shape
{
public:
void draw() { std::cout << t::draw << std::endl; }
};