多态有两类:

1.静态多态:函数重载,运算符重载,复用函数名(编译阶段确定地址)

2.动态多态:子类和虚函数实现运行时的多态(运行阶段确定地址)

注意:父类引用接收子类对象,无需强制转换

动态多态满足条件:

1.有父子关系

2.子类要重写父类虚函数(覆盖)

动态多态的使用: 

父类的指针或引用,指向子类对象

例子:

提前绑定:

class A
{
public:
	void show()
	{
		cout << "父类show()" << endl;
	}
};
class B:public A
{
public:
	void show()
	{
		cout << "子类show()" << endl;
	}
};
//父类引用可以接受子类对象
void show1(A &a)
{
	a.show();
}

int main()
{
	B b;
	//结果输出 父类的show 因为编译阶段 show1函数提早绑定了父类地址
	show1(b);
	return 0;
}

 

后绑定:在 父类中的函数前加 virtual  使之成为虚函数

class A
{
public:
	virtual void show()
	{
		cout << "父类show()" << endl;
	}
};
class B:public A
{
public:
	void show()
	{
		cout << "子类show()" << endl;
	}
};
//父类引用可以接受子类对象
void show1(A &a)
{
	a.show();
}

int main()
{
	B b;
	//结果输出 子类的show 因为父类show函数为虚函数,在运行时,show1函数会后绑定地址
	show1(b);
	return 0;
}