我们在讲fish类的对象fh的地址赋给pAN之时,c++编译器进行了类型转换,此时pAn保存的是animal对象的地址。当fn函数执行pAn->breath()时,调用的就是animal的对象的breath函数。
<-this指针
anima对象内存 |
fish新增加的部分 |
virtual关键字可以改变此种情况;
当c++编译器在编译的时候,发现animal的类的breath()函数是虚函数,这个时候c++采用迟邦定技术,编译时并不确定其具体的调用函数,而在运行时,依据对象的类型(比如是传递的类对象的地址)来确认调用的是哪一个函数。这种能力就是c++的多态性。,如果没有在breath()函数前加virtual关键字时,c++编译器在编译时就确定了哪个函数被调用,这叫做早期绑定。
c++的多态性用一句话概括:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象的类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。
凡是含有纯虚函数的类叫做抽象类,这种类只是作为基类的派生类服务,在派生类中必须完全实现基类的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。