本文所述内容如有差错,欢迎评论区指出。
我们都知道子类继承父类,然后父类指针指向子类对象,则父类指针调用的虚函数其实是调用的子类的虚函数。如下所示,这里假设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++没有什么隐藏规则,有些书中会提到隐藏规则,大家注意辨别。
-
相关阅读:
【算法系列篇】模拟算法
【无标题】
SW免安装的toolbox只读问题
tomcat启动后,执行一个方法作为监听
C语言的printf输出问题
区别Vue 2.0 和 Vue 3.0
Java 类集 习题
mybatis判断list长度与数组长度
淘宝/天猫获得淘宝商品详情 API 返回值说明
工业镜头的重要参数之视场、放大倍率、芯片尺寸--51camera
-
原文地址:https://blog.csdn.net/qq_23418043/article/details/126316239