c++ map 析构函数_C++虚函数、重载、覆盖

news/2024/7/7 10:06:48

C++基础(五)虚函数、重载、覆盖、隐藏 虚函数总是跟多态联系在一起,引入虚函数可以使用基类指针对继承类对象进行操作!虚函数:继承接口(函数名,参数,返回值),但是实现不继承(函数体)

非虚函数:继承接口,也继承实现;

1)虚析构函数(当一个类打算作为基类使用时候,其析构函数必须是虚函数)

构造函数可以为虚函数吗? 不可以,在生成对象的时候,必须向编译器明确指定要生成什么类型的对象,因而不存在虚函数的问题;只有当对象已经存在,我用什么接口去操作它的问题;

例子:

class A{public:A();virtual~A();};class B: public A{public: B();~B();};int main(){A *pA=new B; //调用B的构造函数delete pA; return 0; }

这里通过指针A去调用B类的析构函数,但是如果 ~A()不是虚析构函数,就不存在多态,就会去调用A中的析构函数,最后结果可能是B对象中的A成分被析构了,其他 还残留;所以当一个类作为基类时候,其析构函数必须是虚函数,这样防止出现析构不完全的情况;

2)当虚函数出现在构造、析构函数中时(即在构造函数中调用虚函数),函数退化为普通函数。为什么? <>中条款

例子:(转自<>中条例9)

class Transaction

{public:Transaction();virtual void LogTransaction() const = 0;// ...};Transaction::Transaction(){// ...LogTransaction();}class BuyTransaction : public Transaction

{public:virtual void LogTransaction() const;// ...};

这里调用BuyTransaction的构造函数,因为BuyTransaction是继承类所以先调用基类的构造函数,此时派生类独有的那部分还未初始化,<>中这么解释:“这个对象内的BuyTransaction成分还未初始化,最安全的办法是当他不存在,对象在derived成分还未初 始化时该对象不会成为一个derived对象”所以Transaction 的构造函数会调用基类的 LogTransaction() const;而且此处是个纯虚函数,会报错

3)虚函数与覆盖,重载,隐藏

重载首先出现在非继承关系当中,当同一个类中,两个函数的参数不同,名字相同,返回值类型无所谓(函数返回值不作为重载的参考,因为函数调用时候不出现返回值);

注意两个函数可以仅仅因为const与非const的差别来实现重载;

虚函数与覆盖均出现在一个继承体系中,覆盖针对的是普通函数,当父类子类中出现同名(相同返回值,相同参数,相同函数名)要求绝对一致

虚函数在父类子类中,首先在父类中声明该函数为virtual,那么子类可以重新定义该函数的实现,这里主要涉及多态,就是覆盖的情况加上virtual,通过指针或者引用实现多态;

隐藏显得简单粗暴,在继承类中只要出现于父类同名(只要求同样的函数名/变量名,其他返回值,virtual 非virtual不管)的函数,则用对象调用同名函数时候,基类对应的同名函数、变量隐藏,如果要访问其父类的同名成员应该明确使用 基类名::成员来访问;

例子:

class A{public:virtual ~A(){};void process(int i,char c); //重载,编译期间即可确定该调用哪个函数char process(double d,int c); //只要函数名相同,返回无所谓,参数不同void process(int i); void process(int i)const; // 此处相当于void process(const A *this,int i);void process(consttint i); //这里仅仅因为const属性不同即可实现重载virtual int foo(int, char){...}; int foo2(){};void foo3(int,int ){};}class B: public A{public:int foo(int ,char){...}; //虚函数,这里函数接口要严格一致(大部分编译器要求返回值也要一致)int process(){...}; //隐藏基类函数 int foo2(){}; // 这里不含虚属性,会覆盖int foo3(){return 0;}; //会隐藏A类的foo3}int main(){B b;A *pA=&b;pA->foo2(); //这里调用A类的foo2();不涉及多态;pA->foo(3,'c'); //B类foo() 涉及多态}

总结:

1)覆盖与虚函数是一对兄弟,要求函数的返回值,函数名,参数严格一致,虚函数是覆盖加上virtual的情况;

2) 隐藏是覆盖的推广,覆盖是隐藏的特例,只要求函数名一样,其他不管,在继承体系中,子类的同名函数会将父类的同名函数隐藏;

3)当使用指针时候,指向基类的指针会根据实际对象的类型,选择相应的虚函数执行,如果派生类没有重新定义基类的虚函数,那么依然执行基类的虚函数;

4)当不存在虚函数的情况下,使用基类的指针,不会下降到派生类中去搜索函数;所以virtual属性相当于告诉基类指针:当执行我时,请到相应对象中搜索对应的虚函数;

5)纯虚函数所在的类是抽象类,不能实例化,定义了纯虚函数意味着这个函数只能为父类,其负责定义接口而不负责实现;

6)当使用对象来调用相应的函数时候,主要考虑的是对基类同名函数的隐藏(包括覆盖),而不需要考虑多态;

7)注意构造析构函数中不能调用虚函数,当执行派生类的构造函数时候,先构造的是其基类成分,再执行派生类成分的构造,虚函数此时无意义;

8)c++是个细节非常多,非常复杂的语言。

更多内容,欢迎关注我的公众号:无情剑客

1071eb59c4d9b654faf1d160bd193efc.png

http://www.niftyadmin.cn/n/2067592.html

相关文章

如何简洁实现游戏中的AI

2019独角兽企业重金招聘Python工程师标准>>> 端午节放假总结了一下好久前写过的一些游戏引擎&#xff0c;其中NPC等游戏AI的实现无疑是最繁琐的部分&#xff0c;现在&#xff0c;给大家分享一下&#xff1a; 从一个简单的情景开始 怪物&#xff0c;是游戏中的一个基…

oracle有日志文件吗,oracle 日志文件

以下来自Oracle文档.使用诊断文件监视例程:• 共有以下几种类型&#xff1a;– alertSID.log 文件– 后台跟踪文件– 用户跟踪文件使用诊断文件监视例程诊断文件是获取有关数据库活动的信息的一种方法。同时也是管理例程的有用工具。诊断文件有几种类型。创建的诊断文件的类型取…

2020年最后一天,今年你立的flag实现了吗

1. 你立的flag实现了吗今天是2020年最后一天&#xff0c;大家都努力的坚持到了现在十分不易&#xff0c;不知道大家立的flag实现了没有&#xff0c;在今年疫情期间胖哥暗自下决心粉丝突破一万&#xff0c;目前已经极其接近了&#xff0c;所以勉强算实现了吧。心态还是要放平一些…

LVMRAID

RAID技术主要是针对传统服务器部署的&#xff0c;应该是云服务商或硬件服务商底层部署实现。 LVM则是允许对硬盘分区大小进行灵活管理的一种机制。以下是学习的笔记内容&#xff0c;主要是参考学习了红帽培训书籍《Linux就该这么学》《高性能MySQL》以及掺杂了一些自己实践后的…

二叉树层序遍历递归与非递归_秋招之路-二叉树四种遍历(递归和非递归代码实现)...

前言今天和大家带来的是二叉树的常见面试题&#xff0c;前序&#xff0c;中序&#xff0c;后序&#xff0c;层次遍历&#xff0c;递归和非递归&#xff0c;这里用 C 代码实现。二叉树的遍历&#xff08;traversing binary tree&#xff09;是指从根结点出发&#xff0c;按照某种…

oracle根据分区移动,讲解Oracle移动数据文件到新分区的过程

讲解Oracle移动数据文件到新分区的过程以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;此过程用sqlplus以sys登录后进行如下步骤 ◆ 将数据文件offlinealter database datafile D:\ORACLE\PR…

python tkinter button_python-tkinter按钮不显示

当我执行脚本时,背景图像可以正常工作,它将与窗口的大小匹配,但是,我无法显示按钮(它们尚无功能).我对python相当陌生,所以不确定是否将按钮用作事件是一个好主意.任何帮助表示赞赏. import turtle import tkinter as tk from tkinter import * from PIL import Image,ImageTk …

oracle里面cat,Oracle 12c 中推荐使用 catcon.pl 执行SQL脚本

https://www.cndba.cn/dave/article/225https://www.cndba.cn/dave/article/2251 说明在Oracle 12c中&#xff0c;Oracle 建议使用catcon.pl 脚本来执行SQL 脚本和SQL 语句&#xff0c;其可以在root 和指定的PDB中执行。 Catcon.pl脚本是一个perl 脚本&#xff0c;需要在操作…