首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】多态 ⑨ ( vptr 指针初始问题 | 构造函数 调用函数 - 没有多态效果 )

, 则 没有 多态效果 ; 一、vptr 指针初始问题 1、vptr 指针与虚函数表 " 虚函数表 " 由 C++ 编译器 负责 创建 与 维护 , 被 virtual 关键字 修饰函数 ,..., 在 对象 被 创建时 , 由 C++ 编译器 对 对象 vptr 指针进行初始操作 , 对象 创建完成 后 , 也就是 虚函数 整理完毕 , 全部放到 虚函数后 , vptr 指针 才会指向...虚函数首地址 ; 父类 对象 vptr 指针 指向 父类 函数表 首地址 ; 子类 对象 vptr 指针 指向 子类 函数表 首地址 ; 3、构造函数 调用函数 -...父类构造函数 调用 fun 虚函数 , 只能调用 父类本身 fun 函数 , 此时 vptr 指针没有指向 虚函数表 , 虚函数表未生效 , 只能调用 父类 fun 函数本身 ; 父类 构造函数...调用完毕后 , vptr 指针 才指向 父类函数表 ; 然后 , 调用 子类 构造函数 , 此时在 子类构造函数 调用 fun 虚函数 , 只能调用 子类本身 fun 函数 , 此时 vptr

21720

【C++】C++ 类 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

, 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数 , 通过 this 指针访问对象本身成员 ; 在全局函数 , 实现两个 Student 类相加 , 接收两个...Student 引用类型参数 , 引用相当于一级指针 ; // 全局函数 , 将两个 Student 对象相加 // 引用 等同于 一级指针 , Student 引用用法与 Student 对象用法相同..." << endl; } 此时 , 如果要创建 Student 对象 , 只能调用上述 有参构造函数 , 如果使用 Student s2 方式调用 默认构造函数 创建 Student 对象 , 就会报错...// this 是指针 , *this 是指针指向 自身对象 return *this; } 返回 引用 , 就是返回自身对象 ; this 是指针 , *this 是指针指向 自身对象...; s2.print(); // 调用全局函数, 将两个 Student 对象相加 // 函数返回 匿名对象 用于 s3 初始 // 直接将匿名对象转为普通对象 Student s3

17420
您找到你想要的搜索结果了吗?
是的
没有找到

《Effective C++》学习笔记

对于一些可能在被别的类直接调用其成员函数、值类,最好改为暴露一个返回其类对象引用函数形式,而不是暴露其类对象本身,这可以保证在函数内完成初始,避免被调用时还没有初始。...条款17:以独立语句将newed对象置入智能指针 如果有函数参数接收智能指针对象,那么该智能指针对象一定要在调用函数前用独立语句去创建,否则在创建所指对象和用该对象绑定智能指针两个操作之间,可能插入一些操作...条款45:运用成员函数模板接受所有兼容类型 真实指针允许父类指针指向子类对象,如果想要让自制智能指针也支持这种对象转换,那就需要特殊操作,因为一般模板类(智能指针能指向多种对象,必然是模板类)只能以自身模板声明类型来构造...做法是声明一个泛构造函数,也就是定义一个模板构造函数,接收模板参数,声明一个指向真实对象指针,声明一个获取该对象指针get函数,用该get函数放在初始列表构造模板类。...这样就能使用一种类型特化出自制智能指针构造另一种类型特化出自制智能指针了。同时,在初始列表编译器会为你检查是否允许该类型转换(比如只允许子类往父类转换,不能相反)。

1.1K20

《Effective C++》读书摘要

三、const const返回值:避免(a*b)=c错误; const参数:传递指向常量引用; const成员函数:允许const属性重载。 四、对象使用前初始 构造函数成员初始列表; ?...七、多态基类声明虚析构函数 (不)具有多态性质基类(不)需要虚析构函数; 八、不让异常逃出析构 异常时终止或者吞下; 将可能抛出异常代码提供给用户管理; 九、不在构造和析构调用函数 调用后仅仅是自身函数...(三)、资源管理 十三、对象管理资源 构造函数获得资源,析构函数释放资源; 使用智能指针封装:tr1::shared_ptr和auto_ptr。...三十、inline里里外外 隐式:累内直接定义成(友)员函数,显式:inline关键字; 拒绝:复杂、虚函数函数指针调用模板构造析构函数、影响动态连接或升级、对调试器挑战(禁用)。...四十二、typename双重含义 模板声明与class没有任何区别; 嵌套从属类型显式指定,不能出现在基类列表和初始列表; ?

1.9K60

【笔记】《Effective C++》条款1-25

但是手动回收很不方便, 很容易忘记释放, 例如一个提早return, 或者跳出异常 最好方法是通过在栈上分配智能指针来管理对象, 因为智能指针是栈上分配模板类, 所以会在控制流离开时候自动调用析构里...delete 养成习惯: 获得堆资源后立刻放入管理对象(构造与new写于同一语句), 这样最大程度确保自己不会遗漏释放 智能指针思路类似其它语言垃圾回收机制, 区别是垃圾回收器是在后台运行另一套系统...写出上面那种在一个语句(尤其是函数参数列)执行new, 构造智能指针, 和其它操作代码很危险....因为编译器会自由安排函数不同参数求值顺序, 有可能顺序变为new->调用函数->构造智能指针....一旦这里调用函数时候跳出异常, 那么new返回值无法交给构造函数, 就无法delete从而产生很奇怪内存泄露 由于编译器对跨语句调用顺序没有排列自由, 因此一定要记得在独立语句中将new置入智能指针

98230

【C++】侯捷C++面向对象高级编程(下)

但是sp->method(),我们可以看到,调用sp->在右侧返回px,再往下看px->method(),会发现,这里其实少了一个->,这里就体现出这个符号特殊性了,得到东西会继续用箭头符号作用上去...示例——标准库list迭代器 foo即data 注意与上面智能指针重载运算符对比。 说明: 左边方框内容等同于右边话蓝线部分。...补充:C++ Upcast(向上造型) up-cast为向上构造 down-cast为向下构造 ---- 模板特化(specialization) 全特化 泛反面就是特化 泛(又叫全泛)指的是用时候指定类型...范围上偏 例如,接收任意范围T,到接收指针T* ---- 模块模板参数(tempalte template parameter) 即,模板参数又是一个模板 如上图所示,传递任意容器与元素类型进行组合...调用指针->向上转型(转为具体子类)->调用函数 补充: 继承父类,函数,继承调用权。 父类函数子类也一定要有。 父类和子类可以出现同名函数,但实际上不是同一个。

61820

【笔记】《Effective C++》条款26-55

这个初始函数一般在接口类构造函数或初始列表中被调用. 别忘了虚析构函数 采用这种方法将实现和接口解耦代价是运行期需要额外增加很多间接访问, 且对象增加一个实现指针或一个虚表指针内存....函数 非虚函数继承是静态绑定, 因此如果我们用基类指针指向派生类对象, 然后调用这个非虚函数, 或者反之操作, 都只会调用指针本身声明那个类型下函数, 无关其实际对象类型 相类似的, 函数参数和引用在这类场景下也会产生相似的效果..., 因此我们无法直接在模板调用模板基类成员 有三种方法处理这个问题: 在调用基类函数前加上this指针this->foo();, 用指针进行多态调用 用using声明式using Base<Tmp...45 运用成员函数模板接受所有兼容类型 模板之间并没有什么类似继承关系固有关系, 无法自动在继承类之间进行隐式转换, 智能指针类通过底层转型来模拟这种关系 方法是编写用于指针间类型转换构造模板,...称为成员函数模板(member function template) 智能指针类编写了非explicit构造函数, 在自身底层是T类型指针时, 接受一个U类型指针作为构造函数参数, 然后通过原始指针本身转换和继承形式将

88530

C++知识概要

) 派生类自己构造函数 必须使用成员列表初始四种情况 当初始一个引用成员时 当初始一个常量成员时 当调用一个基类构造函数,而它拥有一组参数时 当调用一个成员类构造函数,而它拥有一组参数时...除此以外,在函数调用时,其参数也会被压入发起调用进程栈,并且待到调用结束后,函数返回值也会被存放回栈。由于栈先进先出特点,所以栈特别方便用来保存/ 恢复调用现场。...注意它与数据结构堆是两回事,分配方式倒是类似于链表 全局区(静态区)(static) — 全局变量和静态变量存储是放在一块,初始全局变量和静态变量在一块区域,未初始全局变量和未初始静态变量在相邻另一块区域...函数模板实例是由编译程序在处理函数调用时自动完成,而类模板实例必须由程序员在程序显式地指定。...This 指针首先入栈,然后成员函数参数右向左进行入栈,最后函数返回地址入栈。 智能指针怎么用?智能指针出现循环引用怎么解决?

1.1K20

【笔记】《C++Primer》—— 第12章:动态内存

和容器类类似智能指针也是模板类 12.1.1-12.1.4 shared_ptr 通常讲到C++智能指针就是指shared_ptr,其操作如下 ?...智能指针优势在于它帮用户管理了关于动态内存对象引用和销毁 最方便使用动态内存方式是调用make_shared函数,它使用参数args初始类型为T对象并返回指向这个对象智能指针,当我们想要用...注意不要把智能指针和内置指针混用,让智能指针和内置指针都指向同一块内存容易导致引用问题,我们将无法确切得知合适这个对象应该被销毁 类似的也不要用智能指针get函数提取内部指针出来构造别的智能指针,因为这样引用计数无法传递...,get函数是用来适配一些无法传入智能指针函数而出现 当程序跳出异常时,在delete前用new分配内存不会自动释放,而智能指针仍然能在正确时候释放 如果要给智能指针调用删除器函数,需要在构造指针时第二个参数传入一个可调用对象...其中uninitialized_copy函数返回指向最后一个构造元素指针 ?

46710

计算机考研复试C语言常见面试题「建议收藏」

+模板 4 10、内存泄漏 5 11、智能指针 6 12、野指针 7 13、new与malloc区别 7 14、堆栈区 7 15、虚函数与纯虚函数 8 16、为什么析构函数必须是虚函数?...+支持范式编程,比如模板类、函数模板等 3、Java方法重载 就是在类可以创建多个方法,它们具有相同名字,但具有不同参数和不同定义。...4、重写和重载 5、面向对象编程 (1)封装:将数据或函数集合在一个类类。 (2)继承:子类可以继承父类一些数据和函数。 (3)多态:运行时,可以通过指向基类指针调用派生类方法。...使用智能指针可以很大程度上避免这个问题,因为智能指针就是一个类,当超出了类作用域时,类会自动调用析构函数,析构函数会自动释放资源。...,引入了weak_ptr弱指针,weak_ptr构造函数不会修改引用计数值,从而不会对对象内存进行管理,其类似一个普通指针,但不指向引用计数共享内存,但是其可以检测到所管理对象是否已经被释放,

1.5K30

读完某C++神作,我只记下了100句话

const对象,指针引用只能调用常量成员函数。 没有前缀成员都被假定为this在调用。 默认构造函数按变量初始规则初始类中所有成员【内置类型作为局部变量时不初始】。...初始化时是否调用复制构造函数取决于是否有=【拷贝构造函数,复制也叫拷贝构造函数是用同一个类一个对象初始另一个对象,普通构造函数是用各种参数初始一个类对象】。...合成析构函数并不删除指针成员指向对象。即使编写了自己析构函数,合成析构函数仍然运行。 默认构造函数不全,会调成员默认构造函数,复制构造函数不全就不行了。 使用计数是管理智能指针通用技术。...对象不支持动态绑定,指针和引用支持但使用起来麻烦,解决方法是定义包装类或句柄类【提供到其它类接口类】。像使用指针一样使用句柄而不用管理它指向对象。类似智能指针方法建立指针句柄。...模板static成员由同一实例对象共享,但不同模板形参实例对象间不共享。

1.4K20

C++复习篇

25.泛型函数模板(兼容不同类型) 26.泛型类模板(兼容不同类型) 27.数值型函数模板和数值型类模板(兼容不同数值) 28.C++智能指针 29.Qt智能指针 1.const const和define...最后调用对象本身构造函数 12.const成员函数 cosnt成员函数里只能调用const成员函数 const成员函数不能直接修改成员变量值 只有对mutable成员变量或者顶层const成员是可以修改...Child类为例,在编译器,可以将子类对象退化为父类对象,从而实现子类来初始父类,比如: Parent p1(Child()); //Child()构造函数返回一个临时对象,从而通过子类初始父类...构造函数为explicit类型,所以只能显示初始 提供get()成员函数,可以用来查看类里指针地址 一个堆空间永远只属于一个对象(比如auto_ptr被拷贝/赋值,则自身指针指向地址会被抢占)...29.Qt智能指针 -QPointer 当其指向对象被销毁时,本身会自动赋值为NULL(从而避免被多次释放和野指针) 缺点在于,该模板类析构时,不会自动摧毁所指向对象(需要手工delete)

1.3K20

【笔记】《C++Primer》—— 第三部分:类设计者工具

,派生类一般在构造函数开始地方调用基类构造函数,让基类来初始自己成员 静态类型是变量本身代码类型,在编译时决定,动态类型是变量在内存对象类型,在运行时才能决定。...,这些实参不会被继承,而是派生类会得到多个继承构造函数,每个构造函数省略一个有默认实参形参 当我们想要把继承体系对象存放到容器时,最好使用间接存储也就是存放基类指针(智能指针就更好了) 16...,做法和默认函数实参类似但是写在模板参数列表里,也只能出现在最右侧 当需要在类外部定义类成员模板时,要注意此时需要两个template连用来说明标识符 extern显式实例会实例模板所有成员,包括内联成员函数...,我们可以用尾置返回来完成这个目标: 标准库头文件type_traits类来进行特殊类型转换能够动态地将这些语言特性消去传入参数中提取出我们想要类型 编译器是模板函数调用推断具体实参类型要求在...,另一种用法是对包每个元素都自动调用一个指定函数,并返回处理后返回模板特例写法是将template尖括号需要特例内容删去,然后对下方用到模板类型转为需要确定类型。

1.7K10

CC++开发基础——智能指针

一,智能指针 1.智能指针简介 智能指针是用法和行为类似指针类对象。 智能指针底层对原始指针做了一定封装。...2.智能指针基础用法 1.智能指针初始 智能指针是基于类模板生成,因此,要初始一个智能指针,就必须声明指针所指向数据类型,不然智能指针里面包含原始指针是个空指针。...初始方式一,在智能指针构造函数new一个新对象。...new int[10]); //类型+[],表示初始指向数组智能指针 //后面的具体用法和数组类似 Array_1[0] = 1; Array_2[0] = 2; 注意,初始weak_ptr需要用到...智能指针解引用操作与原始指针类似,可以调用"*"或"->"对智能指针进行解引用,访问分配到堆内存地址。

24520

动态内存与智能指针

shared_ptr 类 类似于vector 智能指针也是模板。创建智能指针时,必须提供额外信息——指针可以指向类型。 智能指针用法与普通指针类似。...为了方便使用智能指针,我们必须坚持一些基本原则: 不使用相同内置指针初始多个智能指针 不delete get函数返回指针 不使用get初始或者reset另一个指针指针 如果使用get返回指针...release返回指针通常被用来初始另一个智能指针或者给另一个智能指针赋值,如果我们不用另一个智能指针保存release返回指针,则需要手工释放指针指向资源 p2.release(); //错误...最常见例子是函数返回一个unique_ptr unique_ptr clone(int p){ return unique_ptr(new int(p)); } 还可以返回一个局部对象拷贝...我们按照需要在此内存构造对象。 成员函数construct接受一个指向将要被构造内存指针,同时可以接受额外参数作为构造对象时参数。

81820

【笔记】《C++Primer》—— 第二部分:C++标准库

make_shared函数,它使用参数args初始类型为T对象并返回指向这个对象智能指针,当我们想要用new时候可以用这个函数来替代 由于智能指针内有引用计数,所以可以让多个智能指针指向同个对象共享数据...,并以此管理内存释放 注意不要把智能指针和内置指针混用,让智能指针和内置指针都指向同一块内存容易导致引用问题,我们将无法确切得知合适这个对象应该被销毁 类似的也不要用智能指针get函数提取内部指针出来构造别的智能指针...,因为这样引用计数无法传递,get函数是用来适配一些无法传入智能指针函数而出现 如果要给智能指针调用删除器函数,需要在构造指针时第二个参数传入一个可调用对象,且此对象参数必须是一个该类型元素指针...函数来转移它所有权 我们同样可以像shared_ptr那样自定义指针删除器,但是我们必须类似指定关联容器比较器一样在模板尖括号中指出删除器类型 弱指针是一种不会影响对象生存期指针,一般用来引用和标识...construct函数构造其中元素,用destroy来析构元素 当需要批量构造元素到这段内存时,我们可以使用uninitialized系列算法来填充,使用起来类似于copy函数

58430

整理了70道C语言与C++常见问答题

malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数 new 、delete 返回是某种数据类型指针,malloc、free 返回是void 指针。...「注意」:无论是指针常量还是常量指针,其最大用途就是作为函数形式参数,保证实参在被调用函数不可改变特性。 27 如何避免“野指针指针变量声明时没有被初始。...使用智能指针可以很大程度上避免这个问题,因为智能指针就是一个类,当超出了类作用域是,类会自动调用析构函数,析构函数会自动释放资源。...举个例子:一个父类类型指针指向一个子类对象时候,使用父类指针调用子类重写了父类函数时候,会调用子类重写过后函数,在父类声明为加了virtual关键字函数,在子类重写时候不需要加...(2)类模板特例 原理类似函数模板,不过在类,我们可以对模板进行特例,也可以对类进行部分特例

3K01

第 12 章 动态内存

int *p(new int(42)); delete p; p = nullptr; 可以用 new返回指针来初始智能指针,但该接受指针参数智能指针构造函数是 explicit。...另外,对于没有良好定义析构函数类对象,也可以使用智能指针来管理,不管是否发生异常,当智能指针类对象不再使用时,会调用相应删除器函数进行内存回收。...对于 shared_ptr类模板,删除器是类模板 function数据成员,可以通过拷贝构造函数或 reset函数进行更改。...不能对动态数组调用 begin或 end函数,也不能用范围 for语句来处理动态数组元素。 普通数组长度不能为 0,而动态数组长度可以为 0。...对数组元素进行值初始,可以再大小之后跟一对空括号。与分配单个对象不同,分配数组对象,不能在圆括号内指定初始值。但是可以在花括号内提供元素初始器,具体规则与使用大括号初始内置数组类似

1.4K40

React Native for Android源码分析 一《JNI智能指针之介绍篇》

由上可见,JNI智能指针第一个需求,就是要自动管理jobject生命周期,当进入与离开对应作用域时,需要自动调用对应生命周期创建与销毁函数。这在C++,通常会结合构造与析构函数来进行配对调用。...若功能仅限于此,就与普通智能指针和mutext锁管理机制类似了,更重要需求是在C++层提供与被管理Java对象镜像结构C++对象,形成高层次封装。...上面例子返回obj可以调用wrapper提供镜像方法,应可以看出,智能指针存放并不是原始jobject,而是更抽象wrapper MyClass对象。...与通常智能指针不一样,local_ref局部指针模板参数并不直接指代其存储值类型。...结尾 ---- 这些问题将在下一篇智能指针具体实现篇解答。

1.2K50

C++primer学习笔记(六)

可以使用域操作符强制调用基类虚函数【虚调虚】。基类虚函数和派生类默认实参要一致。...构造函数无法继承,派生类构造数还要初始基类【否则只能用合成构造函数初始】。初始列表和初始顺序无关。只能初始直接基类。...对象不支持动态绑定,指针和引用支持但使用起来麻烦,解决方法是定义包装类或句柄类【提供到其它类接口类】。像使用指针一样使用句柄而不用管理它指向对象。类似智能指针方法建立指针句柄。...泛型代码两个原则:1.模板形参是const引用 2.函数只用<比较 模板形参数量自由,可以设定返回值为一个形参。...模板static成员由同一实例对象共享,但不同模板形参实例对象间不共享。

1.1K20
领券