C++笔记(五)--- 虚函数(virtual)

目录

虚函数介绍

虚函数、覆盖和重载区别


虚函数介绍

C++的虚函数是多态性的表现

1.构造函数不能为虚函数
2.子类继承时虚函数仍为虚函数
3.虚函数类外实现时,不需要加virtual
4.有虚函数的类,析构函数一定要写成虚函数(否则可能会造成内存泄漏)
5.纯虚函数不能实例化,子类必须实现父类虚函数,否则也不能实例化

class A
{
public:
    virtual A(){}    //报错:“A”:“inline”是构造函数的唯一合法存储类
}

class A
{
public:
    A(){ cout << "A() " << endl; }
    virtual void print(void) { cout << "A::print() " << endl; }
};

class B : public A
{
public:
    B() { cout << "B() " << endl;}
    void print(void) { cout << " B::print() " << endl; }//虽然没有写virtual,但继承来自A,所以仍然为virtual。但强烈建议写上virtual
};

class C : public B
{
public:
    C() { cout << "C() " << endl; }
    virtual void print(void);
}

void C::print(void)    //类外实现函数体时不需要加 virtual
{
    cout << "C::print()!" << endl;
}

int main(void)
{
    A *a = new C;
    a->print();    //打印 C::print()!
    return 0;
}
class A
{
public:
    A(){}
    virtual void print(void) = 0;
};

class B : public A
{
public:
    B(){}
//此处没有对print进行实现
};

int main()
{
//    A a;    //报错,“A”: 无法实例化抽象类
//    B b;    //报错,“B”: 无法实例化抽象类

    return 0;
}
class A
{
public:
    A() { cout << "A()" << endl;}
    virtual void print(void) { cout << "A::print()!" << endl; }
    ~A() { cout << "~A()" << endl; }    //此处析构函数未声明为virtual
};

class B : public A
{
public:
    B() { cout << "B()" << endl; }
    virtual void print(void) { cout << "B::print()" << endl; }
    ~B() { cout << "~B()" << endl; }
};

int main(void)
{
    A *a = new B;
    a->printf();
    delete a;    //注意看下面执行结果打印
    return 0;
}

执行结果如下,只执行了类A的析构函数,new出来的B的析构没有执行,内存泄漏

 

当A的析构函数声明为virtual,则先执行B的析构函数,在执行A的析构函数

虚函数、覆盖和重载区别

虚函数:父类某成员函数必须用virtual声明,子类重写的函数定义完全与父类相同(参数类型,参数个数和返回值),发生在父类和子类之间,父类可以调用子类的函数

覆盖:父类成员函数不用virtual声明,子类成员函数名称与父类相同(参数类型,参数个数和返回值可以不同),子类则完全覆盖父类所有相同名称的函数(即子类不能访问父类相同函数名称的函数)

重载:同一类的类成员函数之间,成员函数名称相同,但成员函数的参数类型、参数个数必须有至少一项不同

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024-2-28-网络基础作用

1>思维导图 2>面试问题 I、 &#xff08;1&#xff09;什么是回调函数&#xff1f; 回调函数是作为参数传递给其他函数的函数。通过函数指针&#xff0c;例如异步编程、线程的创建函数。 &#xff08;2&#xff09;结构体与共用体的区别: 结构体是一种数据结构&…

WPF应用程序使用MVVM模式

文章目录 一、前言二、正文&#xff1a;模式 - WPF应用程序使用MVVM设计模式2.0 一些术语2.1 秩序与混乱2.2 MVVM模式的演变2.3 为何WPF开发者喜爱MVVM2.4 Demo应用程序2.5 路由命令逻辑2.6 ViewModel类层次结构2.7 ViewModelBase类2.8 CommandViewModel类2.9 MainWindowViewMo…

游戏小技巧-守卫羊村

春节期间玩了玩美团中的小游戏“守卫羊村”&#xff0c;发现个小技巧&#xff0c;或者可能也算个bug&#xff1a; 当小羊进入矿洞后&#xff0c;便可以在所属的封闭区域中建造建筑物。假如此时&#xff0c;有其它角色&#xff08;羊或狼均可&#xff09;在该封闭区域内&#xf…

面试笔记系列七之多线程+分布式系统基础知识点整理及常见面试题

介绍一下线程的生命周期及状态&#xff1f; 1.创建 当程序使用new关键字创建了一个线程之后&#xff0c;该线程就处于一个新建状态&#xff08;初始状态&#xff09;&#xff0c;此时它和其他Java对象一样&#xff0c;仅仅由Java虚拟机为其分配了内存&#xff0c;并初始化了其成…

flutter 人机验证实战

先看效果 基本思路 接口进行触发是否进行图像验证&#xff0c;验证后将结果携带到接口里面去&#xff0c;进行人机验证 使用的技术(可惜只有web版本的) 验证码2.0智能人机验证(VAPTCHA)- 安全、易用、完全免费手势验证码VAPTCHA是基于人工智能和大数据的次世代人机验证解决方案…

HTML列表

想要在HTML中实现列表功能&#xff0c;无序用<ul>&#xff0c;有序用<ol>&#xff0c;有手就行。 效果图&#xff1a; CODE: <!DOCTYPE html> <html> <body><h2>一个无序 HTML 列表</h2><ul><li>咖啡</li><…

网络爬虫的危害,如何有效的防止非法利用

近年来&#xff0c;不法分子利用“爬虫”软件收集公民隐私数据案件屡见不鲜。2023年8月23日&#xff0c;北京市高级人民法院召开北京法院侵犯公民个人信息犯罪案件审判情况新闻通报会&#xff0c;通报侵犯公民个人隐私信息案件审判情况&#xff0c;并发布典型案例。在这些典型案…

Apache Paimon Append Scalable表解析

1.Append Scalable Table a) 定义 在表属性中配置 ‘bucket’ ‘-1’&#xff0c;将进入 “unaware-bucket mode”&#xff0c;在此模式下不再有桶的概念&#xff0c;也不保证流任务读取数据的顺序&#xff0c;可以将此表视为批量离线表&#xff0c;所有记录都将进入一个目录…

Codeforces Round 929 (Div. 3)

Codeforces Round 929 (Div. 3) Codeforces Round 929 (Div. 3) A. Turtle Puzzle: Rearrange and Negate 题意&#xff1a;可以对整数数组进行两个操作&#xff0c;一是随意重新排列或保持不变&#xff0c;二是选择连续子段元素符号倒转&#xff0c;求可能最大的所有元素和…

hadoop学习中遇到的问题一

由于看视频总是断断续续&#xff0c;经常遇到各种报错&#xff0c;现将遇到的问题进行总结。 hadoop学习中遇到的问题&#xff1a;hadoop拒绝连接 hadoop安装好之后&#xff0c;在本地浏览器输入地址http://192.168.222.102:9870&#xff0c;提示拒绝连接。在网上找了很多相关…

【Quarto】Markdown导出PPT

title: “Quarto Basics” mainfont: “LXGW WenKai Mono” format: revealjs: theme: default incremental: true pptx: incremental: true html: code-fold: true beamer: incremental: true aspectratio: 169 QUARTO 这段代码是一个 YAML 头部&#xff08;front matter&…

Unity(第十一部)场景

游戏有多个场景组成&#xff08;新手村&#xff0c;某某副本&#xff0c;主城&#xff09; 场景是有多个物体组成&#xff08;怪物&#xff0c;地形&#xff0c;玩家等&#xff09; 物体是有多个组件组成&#xff08;刚体组件&#xff0c;自定义脚本&#xff09; 创建场景 编辑…

刷题笔记 洛谷 P1162 填涂颜色

思路来自 大佬 hat.openai.com/c/9c30032e-5fb9-4677-8c15-9ea6530dc6db 题目链接 P1162 填涂颜色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 搜索 首先 在外面围上一圈0开始搜素 因为题目说将封闭区域内的0变成2 我们可以在外面进行搜索 把外面所有可以搜索…

【LabVIEW 】串口如何读取长度不一致的字符串

工程经验 1、在循环中&#xff0c;加入定时器&#xff0c;这样可以一段时间读取一次。 2、只要获取完整的一帧数据&#xff0c;就可以进行过滤筛选。

Leetcode—82. 删除排序链表中的重复元素 II【中等】

2024每日刷题&#xff08;117&#xff09; Leetcode—82. 删除排序链表中的重复元素 II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val…

【踏雪无痕的痕四】——0到底是有还是没有?

目录 一、背景介绍三、过程1.0的历史发展&#xff1f;2.如何将0讲给一个刚上一年级的孩子&#xff1f;3.0的边界和意义&#xff1f;4.那四年&#xff0c;到底在培养什么&#xff1f;和0有什么关系&#xff1f; 四、总结 一、背景介绍 最近在看一年级数学&#xff0c;其中介绍到…

几种新能源汽车(纯电、插混、油混、增程)的区别

纯电&#xff1a;顾名思义就是仅用电池驱动。 插混&#xff1a;汽车具备两套独立的动力系统&#xff1a;油动和电动。该种汽车可充电可加油&#xff0c;用油还是用电自己决定。他的系统结构图如下图&#xff1a; 油混&#xff1a;也称为油电混合。他的特点是可加油不可充电&…

前后端分离项目Vue+node.js二手商品交易系统74qb3

校园二手交易网络的开发和使用在不同的地方是有着差别的。在初高中&#xff0c;校园二手交易网也就是简单的买卖物品&#xff1b;但在大学中&#xff0c;通过买卖自己的物品可以建立联系成为朋友&#xff0c;也就是说校园二手交易网不仅仅是一个交易物品的平台&#xff0c;同时…

重拾前端基础知识:CSS

重拾前端基础知识&#xff1a;CSS 前言选择器简单选择器属性选择器组合选择器 插入CSS内嵌样式&#xff08;Inline Style&#xff09;内部样式&#xff08;Internal Style&#xff09;外部样式&#xff08;External Style&#xff09; 层叠颜色背景颜色文本颜色RGB 颜色HEX 颜色…

JS api基础初学

web api基础 变量声明有三个var let 和const 我们应该用那个呢&#xff1f; 首先var先排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉... let or const? 建议&#xff1a;const优先&#xff0c;尽量使用const&#xff0c;原因是&#xff1a; con…
最新文章