本文所述内容如有差错,欢迎评论区指出。
我们都知道子类继承父类,然后父类指针指向子类对象,则父类指针调用的虚函数其实是调用的子类的虚函数。如下所示,这里假设test()函数前面加了virtual,变为了虚函数:
- Derive d;
- Base* b = &d;
- Derive* p = &d;
- b->test();
- p->test();
这时候就会有个困惑,如果没有加virtual,是否还能实现这样的效果。在java语言中,是可以实现的,只要重写了父类函数。如下所示:
- public class Main {
- public static class Base
- {
- public void test() {
- System.out.println("test base");
- }
- }
- public static class Derive extends Base{
- public void test() {
- System.out.println("test Derive");
- }
- }
- public static void main(String[] args) {
- Derive d = new Derive();
- Base b = d;
- d.test();
- b.test();//和C++效果一样
- }
- }
运行结果如下:

在C++中,父类函数前面不加virtual,则无法实现多态特性,直接上代码进行对比。
- #include
- using namespace std;
- class Base
- {
- public:
- void test()
- {
- cout<<"test base"<
- }
- virtual void testV()
- {
- cout<<"test base V"<
- }
- };
-
- class Derive:public Base
- {
- public:
- void test()
- {
- cout<<"test Derive"<
- }
- virtual void testV()
- {
- cout<<"test Derive V"<
- }
- };
-
- int main()
- {
- Derive d;
- Base* b = &d;
- Derive* p = &d;
- b->test();
- p->test();
- b->testV();
- p->testV();
- }
运行结果如下:

如上图所示,有无virtual对于多态特性的实现是非常重要的,test()没有添加virtual关键字,则编译器直接按照类型来调用对应的函数,不会考虑多态特性。testV()由于添加了virtual关键字,则编译器会考虑多态特性,在运行时调用子类的testV()函数。也就是说C++没有什么隐藏规则,有些书中会提到隐藏规则,大家注意辨别。
-
相关阅读:
#名词区别篇:px、em、rem、rpx、vh、vw、vmin 、vmax、%用法 与 区别
Python--练习:使用while循环求1..100的和
axios设置请求头
C#之泛型、委托、事件及其使用
Java.lang.Class类 isMemberClass()方法有什么功能呢?
训练好的神经网络怎么用,神经网络训练电脑配置
java中AES工具类对称加密
Linux守护进程
提升医院安全的关键利器——医院安全(不良)事件报告系统源码
JS 模块、闭包应用
-
原文地址:https://blog.csdn.net/qq_23418043/article/details/126316239