只有虚函数才能使你在仅用一个指针进行调用时,确保访问到期望的方法。非虚函数就没有这个特性。
见代码效果: 区别只在于有没有virtual
1 |
|
1 | 100 |
1 |
|
1 | 100 |
- 那么virtual函数应该在什么情况下用呢?
- virtual 函数应该在某个类的某个函数需要多态性的情况下使用
- 还有一个使用场景是若类存在派生,那么析构函数必须是virtual的,否则可能会导致资源泄露。
- 而非 virtual 函数,能够确保你使用基类指针就一定调用基类实现,防止派生类无意中覆盖。
- 是不是用virtual的函数都能用非virtual的函数替代?
- 正相反,若在开发过程中做了良好约定,所有的非virtual函数都能用virtual函数代替。
- 由于调用virtual函数多了一次查vtable的动作,可能导致(微不可查)的性能损失。不过这并非是不可接受的,某些框架例如Qt,大部分类都是采用这种哲学进行设计,并没有什么问题。
- 有些语言比如 python 就是这么干的,程序员自己去保障覆盖问题。
- 那么是不是virtual没什么用呢?
- 若是不考虑效率和强行避免覆写问题,其实非virtual函数才是没什么用的。