多态介绍
面向对象的核心思想是多态性,其含义是“多种形式”
概念:在子类覆盖了父类函数的情况下,用父类的指针(或引用)调用子类对象,或者通过父类指针调用覆盖函数的时候(动态绑定),实际上调用的是子类的覆盖版本,这种现象叫做多态
注意事项:
只有用父类的指针(或引用)调用子类对象多态才会产生,非指针/引用不会产生多态
且只有用父类的指针(或引用)调用虚函数才会产生多态,调用非虚函数不会产生多态效果
运行时解析:
当我们使用基类的引用或指针调用基类中定义的一个虚函数时,我们并不知道该函数真正作用的对象是什么类型,因为它可能是一个基类的对象也可能是一个派生类的对象
如果该函数是虚函数,则直到运行时才会决定到底执行哪个版本。非虚函数的调用在编译时进行绑定的,类似的,通过对象进行的函数(虚函数或非虚函数)调用也在编译时绑定
多态条件
1、父子类之间有覆盖关系
2、基类必须通过引用或指针指向子类,然后再调用虚函数,此时就可以实现多态
多态的实现方法
1.必须有继承关系
2.父子类之间有重写(覆盖)
3.父类的指针指向于子类,或父类的引用指向于子类
4.通过父类的指针或引用调用成员方法,会实现不同的效果
代码演示
class A
{
public:
//虚函数
virtual void show()const { cout << "A1 "; }
void show2()const { cout << "A2\n"; }
};
class B :public A
{
public:
//虚函数
void show()const { cout << "B1 "; }
void show2()const { cout << "B2\n"; }
};
void printfShow(A const& data)
{
data.show();
data.show2();
}
int main()
{
A a;
B b;
printfShow(a);
printfShow(b);
return 0;
}
原文:https://www.cnblogs.com/swpu-zw/p/12488938.html