虚函数实现了C++的多态特性。
重写虚函数,虚函数的参数类别和个数不可以改变,返回值类型也不可以改变。存在一个例外,当A类的虚函数返回A类指针,B类继承后返回B类指针,但要求A类指针和B类指针可以相互转换。覆盖和重写为一个意思,重载则不同。
可以分为纯虚函数和虚函数,
- 对于父类的纯虚函数,子类在继承之后必须实现不然子类无法实例化。
- 而对于虚函数,子类可以选择覆盖也可不覆盖。
final和override关键字。
override跟在覆盖后的虚函数,可以防止不小心修改了参数类型或者个数,此时编译器会报错。
final关键字表示该函数不能进行覆盖。
可以同时使用override和final修饰,因为他们不冲突而且可以使编译器和用户更好理解。
当父类的非虚函数,子类对其重写之后。如果使用子类的对象调用该函数或者子类对象的指针调用该函数,则运行子类的重写版本,但是如果是父类指针指向子类对象,进行调用那么不会调用子类函数而是父类的函数。
eg1:
Father* p=new Son();
p->func();此时会调用父类的func();
eg2:
Son son;或者Son *son=new Son();
son.func();调用子类的fun()
对于该现象的理解:
虚函数机制是动态的,也就是可以在运行时确定调用的函数。然后如果是非虚函数的重写,父类指针无法找到子类对应的函数,只能调用自身的函数。
既然可以用子类对象调用子类函数,那么为什么需要使用虚函数机制?
实际开发过程中,当我们使用一些基类、框架的时候,它们是事先写好的,使用的时候不能修改库函数的源码,只能同派生类来重新实现库函数。有些库函数由框架调用,因此使用虚函数是一个好的解决方法。
标签:调用,函数,子类,关于,父类,重写,指针 From: https://www.cnblogs.com/hailanben/p/17247274.html