C++ : 继承问题 [virtual函数调用,为什么禁止在virtual使用默认参数]

news2024/9/20 5:25:14

文章目录

  • 子类指针,父类指针分别调用virtual函数,与非virtual函数
  • 虚函数中尽量不要使用默认参数!!!

子类指针,父类指针分别调用virtual函数,与非virtual函数

virtual函数,通过指针调用的是子类函数
非virtual函数,取决于指针的类型

class Person {
public:
    void Print()
    {
        cout << "Person" << endl;
    }
    virtual void VirtualPrint()
    {
        cout << "VirtualPrint Person" << endl;
    }
};

class Studen : public Person {
public:
    void Print()
    {
        cout << "Student" << endl;
    }
    virtual void VirtualPrint()
    {
        cout << "VirtualPrint Student" << endl;
    }
};

int main()
{
    Person *p = new Studen();
    Studen *s = new Studen();
    p->Print();     // Person
    s->Print();     // Student
    p->VirtualPrint();  // VirtualPrint Student
    s->VirtualPrint();  // VirtualPrint Student
    return 0;
}

虚函数中尽量不要使用默认参数!!!

class Father {
public:
    void func1(int val = 100){
        cout << "Father \t: func1" << "\t" << val << endl;
    }
    virtual void func2virtual(int val = 100){
        cout << "Father \t: func2" << "\t" << val << endl;
    }
};

class Son : public Father {
public:
    void func1(int val = 200){
        cout << "Son \t: func1" << "\t" << val << endl;
    }
    virtual void func2virtual(int val = 200){
        cout << "Son \t: func2" << "\t" << val << endl;
    }
};

当指针类型与实体类型一致时,很容易分清楚其调用规则

void group1()
{
    Father *f = new Father();
    Son *s = new Son();
    f->func1();
    s->func1();
    // Father  : func1 100
    // Son     : func1 200

    f->func1(300);
    s->func1(300);
    // Father  : func1 300
    // Son     : func1 300

    f->func2virtual();
    s->func2virtual();
    // Father  : func2 100
    // Son     : func2 200

    f->func2virtual(300);
    s->func2virtual(300);
    // Father  : func2 300
    // Son     : func2 300
}

当指针类型与实体类型不一致时,很不容易分清楚其调用规则
在virtual函数中使用默认参数,因为virtual是动态绑定,导致都是调用了子类函数,但是默认参数是根据指针类型来使用的

void group2()
{
    Father *f = new Son();
    Son *s = new Son();
    f->func1();
    s->func1();
    // Father  : func1 100
    // Son     : func1 200

    f->func1(300);
    s->func1(300);
    // Father  : func1 300
    // Son     : func1 300

    // virtual func use dynamic func, but use ptr default args
    // 重点处
    f->func2virtual();
    s->func2virtual();
    // Son     : func2 100
    // Son     : func2 200

    // virtual func use dynamic func, use given args
    f->func2virtual(300);
    s->func2virtual(300);
    // Son     : func2 300
    // Son     : func2 300
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go语言中的切片详解

1.概念 在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种基于数组的更高级的数据结构&#xff0c;它提供了一种灵活、动态的方式来处理序列数据。切片在Go中非常常用&#xff0c;因为它们可以动态地增长和缩小&#xff0c;这使得它们比固定大小的数组更加灵活。…

电子看板实时监控数据可视化助力工厂精细化管理

在当今竞争激烈的制造业领域&#xff0c;工厂的精细化管理成为提高竞争力的关键。而电子看板实时监控数据可视化作为一种先进的管理工具&#xff0c;正为工厂的精细化管理带来巨大的助力。 一、工厂精细化管理的挑战 随着市场需求的不断变化和客户对产品质量要求的日益提高&am…

记一次键盘f2和f5键被自动触发情况

背景&#xff1a; 联想小新笔记本电脑内置键盘&#xff0c;其中f2键和f5键一直被自动触发&#xff0c;已尝试过更换输入法&#xff0c;重装系统&#xff0c;拆开键帽清灰依旧无效。考虑维修费或者更换键盘&#xff08;内置&#xff09;费都挺贵的&#xff0c;而且f2和f5作用也…

音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

uniapp小程序使用canvas画圆

<view class"container"><canvas canvas-id"arcCanvas" id"arcCanvas" class"arc-canvas" width"300" height"300"></canvas> </view> 最开始我使用…

【华为杯】第二十一届中国研究生数学建模竞赛

“华为杯”第二十一届中国研究生数学建模竞赛即将开始&#xff0c;梦想科研社给大家整理一些比赛信息&#xff0c;在正式开赛后&#xff0c;我们也会持续分享一些课题的分析以及代码&#xff0c;有需要的可以联系我们获取资料信息哦 一、时间节点 1.加密赛题开始下载时间&…

DPDK 简易应用开发之路 1:数据包接收与解析

本机环境为 Ubuntu20.04 &#xff0c;dpdk-stable-20.11.10 DPDK 应用基础 DPDK应用程序的一般处理流程如下&#xff1a; 初始化DPDK环境&#xff1a;调用rte_eal_init()初始化DPDK环境抽象层&#xff08;EAL&#xff09;&#xff0c;设置运行时环境和配置。 配置和绑定网卡…

2024最新版 Tuxera NTFS for Mac 2023绿色版图文安装教程

​ 在数字化时代&#xff0c;数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作&#xff0c;然而&#xff0c;由于MacOS系统默认不支持NTFS的写操作&#xff0c;这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…

超详图解 Apache HTTP Server(httpd)安装与验证

在OpenEuler 24.03系统中安装验证 Apache HTTP Server&#xff08;httpd&#xff09;的过程通常涉及以下步骤&#xff1a; 一、Apache HTTP Server&#xff08;httpd&#xff09;安装 1.检查是否已安装httpd: rpm -q httpd 2.更新系统包索引&#xff1a;更新您的系统包索引以…

基于深度学习的药品三期OCR字符识别

在药品生产线上,药品三期的喷码与条形码识别是保证药品追溯和安全管理的重要环节。传统的识别方法依赖于人工操作,不仅效率低下且容易出错。随着深度学习技术的不断发展,基于OCR(Optical Character Recognition,光学字符识别)的自动化识别系统逐渐成为主流。本文将以哪吒…

【Godot4.2】基于EasyTreeData解析的扩展Tree控件 - ETDTree

概述 基于EasyTreeData解析的扩展Tree控件。 EasyTreeData&#xff08;ETD&#xff09; EasyTreeData&#xff08;ETD&#xff09;是一种基于Tab缩进的简单层级结构数据&#xff0c;可以用于描述树形结构。能够被解析为Tree控件或表示树形结构的其他类或控件。 根目录 | 0节…

cadence SPB17.4 - allegro - 用板子外形创建整板铺铜

文章目录 cadence SPB17.4 - allegro - 用板子外形创建整板铺铜概述笔记先确定自己板子的 board Geometry/Design_Outline 是否有外形shape为了将软件提示看得更清楚&#xff0c;在每个操作之前&#xff0c;先将命令提示区内容先删了用Z-copy从外形层生成整板的铺铜备注END cad…

Maven 和 gradle JavaFX 项目的休眠行为差异

我一直在尝试将Hibernate与我的JavaFX Maven项目集成。它与Hibernate社区包、Jakarta和xerial配合得很好。我还将persistence.xml文件放在了src/main/resources/META-INF/persistence.xml。 我还尝试使用gradle创建另一个项目&#xff0c;并按照此maven项目的步骤操作&#xf…

《高等代数》行列式转置(应用)

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮助到大家那就更加有意义了。 注&#xff1a;1&#xff09;“行列式转置值不变”这一性质在求解行列式的过程中也有极大的作用。

代码随想录算法训练营第51天 | 岛屿数量、岛屿的最大面积

目录 岛屿数量 题目描述 输入描述 输出描述 输入示例 输出示例 提示信息 1. 深搜解法 2. 广搜解法 岛屿的最大面积 题目描述 输入描述 输出描述 输入示例 输出示例 提示信息 1. 深搜解法 2. 广搜解法 岛屿数量 题目描述 给定一个由 1&#xff08;陆地&…

Python和C++气候模型算法模型气候学模拟和统计学数据可视化及指标评估

&#x1f3af;要点 贝叶斯推理气候模型辐射对流及干湿能量平衡模型时间空间气象变化预测模型评估统计指标气象预测数据变换天气和气象变化长短期影响预估降低气候信息尺度评估算法气象行为模拟&#xff1a;碳循环、辐射强迫和温度响应温室气体排放碳循环温室诱导气候变化评估气…

影刀RPA实战:网页爬虫之苦瓜书籍数据

书籍常常被视为心灵的慰藉&#xff0c;因为它们能够在不同的层面上为人们提供支持和安慰。 1. 书籍对我们的重要性 书籍是人类知识的载体&#xff0c;也是智慧的结晶。它们不仅是学习的工具&#xff0c;更是人类心灵的慰藉。在忙碌的生活中&#xff0c;书籍能够提供知识、启发…

VMWare17.5.2中Windows7企业版安装VMWareTools失败及解决办法

一、问题产生环境 宿主机系统&#xff1a;Windows11专业版 x64 虚拟机版本&#xff1a;VMWare17.5.2 虚拟机系统&#xff1a;Windows 7企业版 x64&#xff08;sp1纯净版&#xff09; 二、问题表现现象 在Windows 7企业版系统安装完成后&#xff0c;点击虚拟机编辑&#xff0c;…

安科瑞智能塑壳断路器适用于物联网配电电网中-安科瑞黄安南

智能塑壳断路器是一款多功能、体积小、智能化的塑壳断路器&#xff0c;适用于物联网配电电网中。用于三相四线中性点直接接地的供电、用电系统&#xff0c;能全面采集功率、电能量、功率因数、谐波等用电参数;具有过载、短路、缺相、过压、欠压、剩余电流动作保护等功能&#x…

vscode 环境搭建

1. 插件离线安装 官网链接是&#xff1a;https://marketplace.visualstudio.com/vscode 下载需要的插件&#xff1a; vscode 离线安装 在打开的文件中选择扩展包&#xff0c;点击安装即可 2. 故障解决 参考&#xff1a;https://blog.csdn.net/weixin_63712639/article/det…