C/C++继承与派生

(1)派生类的访问属性

           1)public继承:派生类中:可以访问基类的public和protect变量,不可以访问基类的private变量

                                        派生类外:可以访问基类的public变量,不能访问基类的private变量

            2)protect继承:派生类中:可以访问基类的public和protect变量,不可以访问基类的private变量

                                         派生类外:都不可以访问

            3)private继承:派生类中:都不可以访问

                                       派生类外:都不可以访问

(2)派生类的构造函数

                派生类中包含所有基类的数据成员和派生类中新增的数据成员(包括其他类的对象(子对象)和普通数据成员)。

          1)对于基类成员和子对象成员的初始化必须在成员初始化列表中进行,新增成员的初始化既可以在成员初始化列表中进行,也可以在构造函数体中进行。

          2)派生类构造函数的初始化顺序:基类的构造函数,子对象的构造函数,派生类构造函数体。

         3)当派生类中出现多个基类时,处于同一层次的各个基类的构造函数的调用顺序取决于定义派生类时声明的顺序(自左向右),而与派生类构造函数的成员初始化列表给出的顺序无关

         4)如果派生类的基类也是一个派生类,则每个派生类只需复杂其直接基类的构造,依次上溯。

         5)当派生类中有多个子对象时,各个子对象的构造函数的调用顺序也取决于派生类宏定义的顺序(自前往后),而与派生类构造函数的成员初始化列表给出的顺序无关。

         6)派生类构造函数提供将参数传递给基类构造函数的途径,以保证基类进行初始化时能够获得必要的顺序,如果基类的构造函数中定义了一个或多个参数,派生类必须定义构造函数。

         7)如果基类定义了默认构造函数或根本没有定义一个构造函数,在派生类构造函数的定义中可以省略对基类构造函数的调用。

         8)子对象的情况同7)基类。

         9)当所有的基类或子对象的构造函数都可以省略时,可以省略派生类构造函数的成员初始化列表。

        10)如果所有基类和子对象都不需要参数,派生类也不需要参数时,派生类构造函数可以不定义。

(3)派生类的析构函数

            在派生时,派生类不能继承基类的析构函数,但是需要通过派生类的析构函数去调用基类的析构函数,析构函数的调用顺序与构造函数的调用顺序正好相反,首先调用派生类的析构函数,然后调用成员类对象的析构函数,最后调用基类的析构函数。

            析构函数调用场景:

                      1)对象生命周期结束被销毁时(一般类成员的指针变量与引用都不自动调用析构函数)。

                      2)delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时。

                      3)对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。 

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

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

相关文章

C/C++之string类小结

(1)C字符串和C字符串的转换 C提供了三种方法可以将C字符串转化为C字符串,分别是data(),c_str(),copy()成员函数来实现。 1)data()是以字符数组的形式返回字符串内容,但并不添加‘\0’; 2)c_str(…

2.两数相加 golang

测试用例1500多个,考虑的情况非常多 测试用例 [0] [1] [2] [3,4,2] [5,0] [2] [1] [0] [9,8] [0] [4,6,5] [5,0] [1] [9] [0] [0,9] [2] [8,0,7] [0,1] [3] [0,1]func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {result : &List…

C/C++之vector的内存管理和效率

(1)vector容器支持随机访问,其内部是通过动态数组实现的; (2)当vector执行insert或者push_back时,如果此时动态数组的内存不够用,则会重新分配当前大小的1.5~2倍的新内存区,把原来数组的内容复制过去; (3)为…

汇顶软件开发初面总结20180921

博客参考:C中的多态和内部实现:https://www.cnblogs.com/qiaoconglovelife/p/5128523.html 虚函数表存放的地址:https://blog.csdn.net/jiary5201314/article/details/52627630 为什么STL和linux都采用红黑树作为平衡树的实现:htt…

LeetCode 21. 合并两个有序链表 golang

递归 func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {if nil l1 {return l2}if nil l2 {return l1}if l1.Val < l2.Val {l1.Next mergeTwoLists(l1.Next, l2)return l1} else {l2.Next mergeTwoLists(l1, l2.Next)return l2} }Me(存在问题)非递归版本实现…

深信服C/C++技术一面二面20180924

技术一面&#xff1a;主要是一些关于数据结构和C/C相关的内容 1)链表和数组的相同点和不同点&#xff1b; 2&#xff09;了解静态链表吗&#xff1f;怎么用数组实现静态链表&#xff1f; 3&#xff09;使用库函数strcpy应该注意的问题有哪些&#xff1f; 4&#xff09;链表…

83. 删除排序链表中的重复元素 golang

83. 删除排序链表中的重复元素 golang Me func deleteDuplicates(head *ListNode) *ListNode {if head nil || head.Next nil {return head}result : headfor head ! nil && head.Next ! nil {for head.Val head.Next.Val {head.Next head.Next.Nextif head.Next…

《C++ Primer第五版》习题答案

博客转载&#xff1a;https://blog.csdn.net/misayaaaaa/article/details/53786215 第一章&#xff1a;https://blog.csdn.net/misayaaaaa/article/details/53200001 第二章&#xff1a; 1~10题&#xff1a;https://blog.csdn.net/misayaaaaa/article/details/53200773 11~…

《C++ Primer第五版》第一章-------IO机制和注释缩进

C Primer第一章的内容相对来说比较基础&#xff0c;主要是对C中程序编译的流程、C中的IO机制&#xff0c;for和while循环的介绍、类的构成和注释方法及缩进方法做了简要的介绍&#xff0c;本次博客主要从C中的IO机制和注释缩进等方面做一个总结记录&#xff0c;如果在总结过程中…

19.删除链表的倒数第N个节点 golang

官解 一遍写出来有难度。 [1,2] 2 [2][1,2]1 [1]func removeNthFromEnd(head *ListNode, n int) *ListNode {if n < 0 || head nil {return head}fast : headfor i : 1; i < n && fast ! nil; i{fast fast.Next}if fast nil {return head.Next}slow : headfor…

《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

C Primer第二章的内容主要介绍了变量和基础类型&#xff0c;包括C语言定义的基础内置类型、变量的定义及声明、符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍&#xff0c;本次博客也从这四个方面进行系统的介绍&#xff0c;如果有不足之处&#xff0c;还望其他…

455. 分发饼干 golang

455. 分发饼干 Me func findContentChildren(g []int, s []int) int {if len(s) 0 {return 0}sort.Ints(g)sort.Ints(s)var count, i, j int 0, 0, 0for { if g[i] < s[j] {i, j, count i1, j1, count1} else {j}if i > len(g) || j > len(s) {return count}}re…

《C++ Primer 第五版》第二章(第5小节)——using和typedef,auto和decltype总结

1.using和typedef&#xff08;作用&#xff1a;定义类型别名&#xff09; 1)typedef和using都可以用来定义一个类型别名&#xff0c;二者在类型别名上定义没有区别。只是需要注意的是类型和类型别名的顺序&#xff0c;使用typedef定义类型别名的结构为 typedef 类型 类型别名&a…

204. 计数质数 golang

一次尝试&#xff0c;如何击败100%用户&#xff08;用时&#xff0c;内存&#xff09; func countPrimes(n int) int {if n 499979 {return 41537}if n 11 {return 4}if n 12 {return 5}if n 13 {return 5}if n 14 {return 6}if n 15 {return 6}if n 10 {return 4}if n …

leetcode内存消耗

leetcode内存消耗最是多少 执行用时 :0 ms, 在所有 Go 提交中击败了100.00%的用户 内存消耗 :1.9 MB, 在所有 Go 提交中击败了94.81%的用户测试链接 Test

《C++ Primer 第五版》(第2.5节,第3.1-3.4节) ——采用预处理功能编写头文件,string初始化和字符操作,vector初始化和迭代器

1.采用预处理功能编写头文件 在头文件定义(头文件中的内容是只能被定义一次的实体)过程中&#xff0c;为了防止头文件重复包含的情况&#xff0c;采用预处理器的一个头文件保护符功能,格式为&#xff1a;{ #ifndef 预处理变量(通常大写) #define 预处理变量 #end…

《C++ Primer 第五版》(第3.5-3.6节) ——C++中的内置数组类型,string对象和C风格字符串

1.C中的内置数组类型 C中的数组是内置数据类型&#xff0c;但不是基础数据类型而是构造数据类型&#xff0c;是有限个相同数据、占据着连续物理存储空间的有序集合。而内置数据类型定义的下标运算符可以处理负值运算(只要在数组范围之内)&#xff0c;这和vector及string的下标运…

793. 阶乘函数后K个零 golang

Me(AC 33 / 44 个通过测试用例) func preimageSizeFZF(K int) int {count : 0for i : 0; i < 1000000; i {if trailingZeroes(i) K {count}}fmt.Println(count)//fmt.Println(trailingZeroes(25))return count}func trailingZeroes(n int) int {if n 0 {return 0}return …

小程序radio单选框回显

话不多说&#xff0c;效果图如下&#xff1a; 具体代码如下&#xff1a; <radio-group name"radio" bindchange"getSex"><label><radio value"1" checked"{{xingbie1}}" />男</label><label><radio…

172. 阶乘后的零 golang

官解 一般很难想到这个方向&#xff0c;有点类似数学归纳法&#xff1f; func trailingZeroes(n int) int {if n 0 {return 0}return trailingZeroes(n / 5) n / 5 }