本文所述内容如有差错,欢迎评论区指出。
我们都知道子类继承父类,然后父类指针指向子类对象,则父类指针调用的虚函数其实是调用的子类的虚函数。如下所示,这里假设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++没有什么隐藏规则,有些书中会提到隐藏规则,大家注意辨别。
-
相关阅读:
20240529每日前端--------vue数组对象包含数组,判断子数组是否有重复对象
【C语言三种自定义类型】
京东发布第三季度财报员工总数近50万 “以实助实”助力高质量就业
PerfView专题 (第二篇):如何寻找 C# 中的 Heap堆内存泄漏
Vue基础入门
第五章:WPF中的事件与命令
平板用的触控笔什么牌子好?性价比高的触控笔推荐
怎么把图片转文字?掌握这个技巧,帮你解放双手
latex模板列出所有参考文献并加上超链接(xiaoming et al. 2022; xiaohong et al. 2021)
09.Json语法
-
原文地址:https://blog.csdn.net/qq_23418043/article/details/126316239