前言:我们前一节简单学习了继承,这里继续深入,学习多态和虚函数
一、多态
多态的意思就是“多种形态”,即同一个方法的功能不同,最典型的例子就是父类的方法在子类中进行重写。这时候,方法的行为取决于你的对象,你建立的是父类,就调用父类的该方法的行为,你建立的是子类对象,就调用子类的该方法的行为。
格式:在java中,重写的方法要在末尾中加上关键字override,而在c++中,不再是这样,而是在要被重写的方法的声明前加上关键字virtual,也就是把他定义为虚函数,虚函数的意思就是这个方法会被重写。
注意:父类和子类的该方法的声明前都要加上virtual,而父类和子类的该方法的定义前不在写virtual
二、虚函数
1.既然父类和子类都有相同名字的方法,只是作用不同,那我们如何去抉择选择哪个呢?最简单的就是使用不同的对象,然后用对象去调用各自的函数,比如父类为:class fulei
,父类对象为 st1
,子类为class zilei
,子类对象为st2
,他们都有一个方法是show()
。那么我们可以分别去创建父类子类对象去调用各自的show
,比如st1.show()和st2.show().
但是,我们在使用时,经常用到用父类指针创建子类对象的方法,比如上面的 :fulei *st1 = new zilei
。如果不使用virtual,那么程序将根据指针的类型选择方法,比如上面的指针类型为fulei,那么我们用st1.show()
时调用的是父类类的show(),这显然不符合我们的设定,而当我们设置了virtual,程序将根据指针指向的对象类型选择方法,比如上面的指针指向的对象类型为zilei,那么我们用st1.show()
时调用的是子类的show(),符合我们的设定。
补充:virtual除了要放在要被重写的方法前外,也要放在析构函数前。作用和前面的不同
2.我们知道,子类继承父类的方法如果被重写,那么父类的这个方法在子类里面就不存在了,只存在被重写后的方法,那么如果我们想在子类里面调用父类未被重写的方法的话,怎么办?方法就是使用作用域,即:
zilei::show() //这个就是在子类方法中调用父类的被重写的原方法
{
cout << fulei::show();
}
当然,如果这个方法没有被重写,那么这个方法就会被原封不动的继承到子类中,所以可以在子类中直接使用这个方法,,不用在使用作用域运算符。