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

从零开始学C++之继承(二):继承构造函数派生类转换

一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承构造函数 构造函数不被继承派生类需要声明自己构造函数。...派生类构造函数需要给构造函数传递参数 #include  using namespace std; class ObjectB { public:     ObjectB...从输出可以看出: 派生类对象构造次序: 先调用对象成员构造函数,接着是构造函数然后派生类对象成员构造函数,最后是派生类自身构造函数。...也可以这样来看:构造函数执行顺序是先执行初始化列表,然后函数体。...初始化列表参数多个且其中有调用构造函数时,先执行构造函数(从最远开始,如果多重继承则按继承顺序);其他对象成员若不止一个,则按定义顺序构造,与初始化列表顺序无关。

1.5K00

总结

首先是组合和继承,组合在使用时比较简单,就是一些基本作为一些成员,从而运用这些功能。...继承类似组合作用,组合是将其他作为成员放入,而继承则是直接成员直接继承派生类。...所以若是数据希望被派生类操作,最好是数据成员设为protected。...虚函数定义完成之后,继承之后产生派生类函数就是派生函数,由于这个特性,很多时候对虚函数内容可能就显得有些多余,然后我们就可以使用纯虚函数,这样派生类在对纯虚函数进行定义,作用就可以和虚函数一样...定义方式:virtual 返回类型 函数名()=0; 虚函数可以实现多态,最简单一个应用则是将派生类引用或址给,这样函数会根据派生类对应函数定义来确定函数功能,主要采用址和引用两个方式

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

《Effective C++》读书笔记(二):构造析构赋值运算(条款05~条款12)

而对于自定义类型,它们会自动调用构造和析构函数,如果是别的自定义类型,则会到它们自己中去调用它们构造和析构函数多态构造然后再是派生类构造。...,不要放到析构函数然后使用“双保险”方式,再在析构函数判断是否已经这个函数执行完毕(如果抛异常就是没执行完毕),如果没有执行完毕,再在析构函数执行,让析构函数执行它。...构造函数最后会去执行count_Dog函数,问题就出现在这里,上面说了,构造函数构造期间,virtual函数不会下降到派生类,也就是说即使我们创建对象属于派生类,但是调用构造函数期间...解决这个问题,就要确定我们析构函数构造函数都没有调用virtual函数,要保证这一点,我们可以count_Dog函数变成非虚函数,另外让派生类构造函数时候给传递必要信息给构造函数...只要我们换一个思路,自底向上地传入信息,即先用static特性,把派生类一些必要数据进行初始化,然后递给就可以了。 总结:我们不要再构造和析构期间调用virtual函数了。

34110

C++:52---多重继承

三、构造函数初始化顺序 构造顺序与派生列表出现顺序有关,而与构造函数初始化列表初始化顺序无关 派生类构造自己之前同样需要构造对象。...using从继承构造函数概念 C++11标准,允许派生类从它一个或几个继承构造函数。...使用非合成版本 与单一继承原理一致,多重继承派生类如果定义了自己拷贝/赋值构造函数和赋值运算符,则必须在完整对象上执行拷贝、移动、赋值操作(也就是说建议要拷贝、移动、赋值属于部分数据)...使用合成版本 如果派生类没有定义自己拷贝/赋值构造函数和赋值运算符,那么执行这些操作时将会自动调用拷贝/赋值构造函数和赋值运算符 七、派生类类型转换 与单一继承原理一致,可以一个派生类赋值给一个...//一个Panda对象传递给一个ZooAnimal引用 return 0; } 注意函数重载与二义性错误 编译器不会在派生类转换中进行比较和选择,因为它看来转换到任意一种都一样。

90830

C++抛出异常与传递参数区别

抛出异常与传递参数区别 从语法上看,C++异常处理机制catch子句中申明参数函数里声明参数几乎没有什么差别。例如,定义了一个名为stuff,那么可以有如下函数申明。...: 0025FA20 0025FA20 5 c 0025F950 执行输入操作是,实参localStuff是以引用方式进入函数operator>>,形参变量w接收是localStuff地址,任何对...第一种是继承抓换。即一个用来捕获catch子句可以处理派生类类型异常。这种派生类异常类型转换可以作用于数值、引用以及指针。...因此,一个派生类异常可能被处理其异常catch子句捕获,即使同时存在有能处理该派生类异常catch子句与相同try块相对应。考察如下程序。...对象作为引用参数递给函数时,不需要进行额外拷贝; 第二,对象作为异常被抛出与作为参数递给函数相比,前者允许类型转换比后者要少(前者只有两种类型转换形式); 第三,catch子句进行异常类型匹配顺序是它们源代码中出现顺序

1.6K20

C++抛出异常与传递参数区别

抛出异常与传递参数区别 从语法上看,C++异常处理机制catch子句中申明参数函数里声明参数几乎没有什么差别。例如,定义了一个名为stuff,那么可以有如下函数申明。...: 0025FA20 0025FA20 5 c 0025F950 执行输入操作是,实参localStuff是以引用方式进入函数operator>>,形参变量w接收是localStuff...第一种是继承抓换。即一个用来捕获catch字句可以处理派生类类型异常。这种派生类异常类型转换可以作用于数值、引用以及指针。...因此,一个派生类异常可能被处理其异常catch字句捕获,即使同时存在有能处理该派生类异常catch字句与相同try块相对应。考察如下程序。...对象作为引用参数递给函数时,不需要进行额外拷贝; 第二,对象作为异常被抛出与作为参数递给函数相比,前者允许类型转换比后者要少(前者只有两种类型转换形式); 第三,catch子句进行异常类型匹配顺序是它们源代码中出现顺序

1.8K30

《C++Primer》第十八章 用于大型程序工具

Endangered 最后初始化Panda 1.2 继承构造函数与多重继承 C++11新标准,允许派生类从它一个或几个继承构造函数。...,多重继承派生类如果定义了自己拷贝/赋值构造函数和赋值运算符,则必须在完整对象上执行拷贝、移动或赋值操作。...只有当派生类使用是合成版本拷贝、移动或赋值成员时,才会自动对其部分执行这些操作合成拷贝控制成员,每个分别使用自己对应成员隐式地完成构造、赋值或销毁等工作。...虚继承 尽管派生类列表同一个只能出现一次,但实际上派生类可以多次继承同一个派生类可以通过它两个直接分别继承同一个间接 直接继承某个然后通过另一个再一次间接继承该类 默认情况下...如果ZooAnimal没有默认构造函数,那么代码发生错误。 虚总是先于非虚构造,与它们继承体系次序和位置无关。

1.3K20

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

我们很多时候希望是我们通过指针指向派生类然后可以动态调用派生类函数,这时我们可以对应函数写为虚(virtual)函数来实现,此时发生称为动态绑定 派生类可以继承多个,称为多继承...,派生类一般构造函数开始地方调用构造函数,让来初始化自己成员 静态类型是变量本身代码类型,在编译时决定,动态类型是变量在内存对象类型,在运行时才能决定。...using语句并不要指定形参列表,可以所有重载函数都加入派生类作用域中 继承体系,最关键通常需要定义一个虚析构函数,这样我们才能动态分配体系对象,确保delete时能够执行正确析构函数版本...,对于实现内容我们一样可以使用=default简化 如果基本操作函数不可访问或被删除,则派生类对应成员是被删除因为我们无法使用操作那些成员 C11,我们可以用using重用定义构造函数...,写法和15.6指明重载函数一样,效果与定义一个空构造函数然后列表调用构造函数一致 和普通函数using不同,对构造函数using不会改变构造函数访问级别 当构造函数中有默认实参时

1.7K10

C++11继承构造函数

; 上面代码,我们通过using Base::Base把构造函数继承派生类,不再需要书写多个派生类构造函数来完成初始化。...这样比通过派生类构造函数“透构造函数参数”来完成初始化方案,总是需要定义派生类各种构造函数更加节省目标代码空间。 2.注意事项 (1)继承构造函数无法初始化派生类数据成员。...(2)构造函数拥有默认值会产生多个构造函数版本,且继承构造函数无法继承构造函数默认参数,所以我们使用有默认参数构造函数时就必须要小心。...(3)多继承情况下,继承构造函数会出现“冲突”情况,因为多个部分构造函数可能导致派生类继承构造函数函数名、参数(即函数签名)相同。...此外,使用继承构造函数时,还需要注意以下几点: (1)如果构造函数被申明为私有成员函数,或者派生类是从继承 ,那么就不能在派生类申明继承构造函数; (2)一旦使用继承构造函数,编译器就不会再为派生类生成默认构造函数

1.9K20

1小时深入c++面向对象编程

派生类析构函数 析构函数不能被继承 执行派生类析构函数时,析构函数也将被调用 析构函数执行顺序与构造函数严格相反 4.2.9 示例 ?...图4-8 派生类构造函数调用顺序 4.2.10 派生类构造函数使用应注意问题 派生类构造函数定义可以省略对构造函数调用,其条件是必须有缺省构造函数或者根本没有定义任何构造函数(编译器会自动生成缺省构造函数...) 当构造函数使用一个或多个参数时,派生类必须定义构造函数,提供参数递给构造函数途径(设数据成员为m个,派生类数据成员为n个,派生类参数个数为x,则:0≤x≤m+n) ?...图4-11 多继承构造函数格式 派生类构造函数负责所有构造函数调用 派生类构造函数执行顺序:执行所有构造函数>>执行所有子对象构造函数>>执行派生类构造函数体 处于同一层次构造函数执行顺序取决于定义派生类时所指定顺序...虚子对象由最派生类构造函数通过调用虚构造函数进行初始化 一个成员初始化列表中出现对虚和对非虚构造函数调用时,虚构造函数先于非虚构造函数执行派生类构造函数成员初始化列表必须给出对虚构造函数调用

60320

C++:51---继承构造函数、析构函数、拷贝控制一系列规则

一、继承构造函数 根据构造函数执行流程我们知道: 派生类定义时,先执行构造函数,再执行派生类构造函数 拷贝构造函数与上面是相同原理 二、继承析构函数 根据析构函数执行流程我们知道:...移动操作继承 默认情况下,通常不含有合成移动操作,而且派生类也没有合成移动操作 因为缺少移动操作会阻止派生类拥有自己合成移动操作,所以当我们确实需要执行移动操作时应该首先在中进行定义...} }; 五、特别注意:构造函数和析构函数调用虚函数 根据构造函数,析构函数我们知道: 派生类构造时,先构造部分,然后构造派生类部分 派生类析构时,先析构派生类部分,然后再析构部分 因此...: 构造函数执行时候,派生类部分是未定义状态 析构函数执行时候,派生类部分已经被释放了 所以构造函数或析构函数调用虚函数是不建议,因为: 虚函数执行时候可能会调用到属于派生类成员...,除了两个例外情况,否则派生类继承所有构造函数 1.如果派生类定义了一个构造函数构造函数具有相同参数列表,则在用这个构造函数创建派生类时,执行派生类那个,因为那个没有被继承

1.2K30

硬核 | C++ 基础大全

因为派生类中都没有虚函数定义,那么编译器就会认为不用留给动态多态机会,就事先进行函数地址绑定(早绑定),详述过程就是,定义了一个派生类对象,首先要构造空间,然后构造派生类自身内容,形成一个派生类对象...),仅执行析构,派生类自身内容无法被析构,造成内存泄漏。...也就是说构造派生类部分是,编译器会认为这就是一个类型对象,然后调用类型函数实现,并没有按照我们想要方式进行。即对象派生类构造函数执行前并不会成为一个派生类对象。...析构函数也是同理,派生类执行了析构函数后,派生类自身成员呈现未定义状态,那么执行析构函数是不可能调用到派生类重写方法。...创建组合对象,构造函数执行顺序:先调用内嵌对象构造函数然后按照内嵌对象成员组合定义顺序,与组合构造函数初始化列表顺序无关。然后执行组合构造函数函数体,析构函数调用顺序相反。

1.2K10

C++设计注意事项

构造函数用来创建新对象,它是不能被派生类继承派生类需要定义自己构造函数,并在初始化列表调用构造函数: SubClass::SubClass(int a, int b):BaseClass(...和普通构造函数一样,如果你没定义复制构造函数,编译器提供一个,旦最好显式地自己定义一个,对于一些用new初始化成员,自行用深复制来做复制,否则编译器提供只是简单浅复制,删除时会出问题。...下面这些情况会用到复制构造函数对象初始化为一个同类对象。 按值将对象传递给函数函数按值返回对象。 编译器生成临时对象。...同理,如果要做到不同类之间赋值(也包括赋值给派生类),要么做强制类型转换再赋值,要么定义一个特定参数赋值操作函数。 赋值操作符也是不能被继承,毕竟其特征标(参数列表)随而异。...定义派生类赋值操作符重载函数时,要显式地函数通过::来调用赋值操作符,来操作成员,毕竟派生类很多时候无法直接访问到成员,只能通过调用公开方法来访问,而且也不能通过初始化列表方式来调用

37820

【c++】继承学习(二):探索 C++ 中派生类默认机制与静态成员共享

应该使用构造函数来初始化 确保构造函数被调用是继承中非常重要一部分,因为只有构造函数知道如何正确初始化定义成员。...因此,构造函数总是首先被调用,再是派生类定义成员变量 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化,一般情况下默认生成就够用,如果涉及到深拷贝,就需要自己显示实现 Student...当 Student 析构函数被调用并完成执行后,Person 析构函数随即被自动而且默认地调用。..._stuNum << endl; } 这里会编译错误: 某些函数声明为友元,这个友元关系不会自动传递给从派生)。...因此,无论是还是派生类访问静态成员,访问都是同一个数据。设计层次结构时,这一点非常重要,因为静态成员行为可能会影响整个

10010

常见c和cpp面试题目汇总(一)

,重写overwrite,这三者之间区别: overload,语义相近几个函数用同一个名字表示,但是参数和返回值不同,这就是函数重载;特征:相同范围(同一个)、函数名字相同、参数不同、virtual...关键字可有可无 override,派生类覆盖函数,实现接口重用;特征:不同范围(派生类)、函数名字相同、参数相同、必须有virtual关键字(必须是虚函数) overwrite,派生类屏蔽了其同名函数...如果析构函数不被声明成虚函数,则编译器实施静态绑定,删除指向派生类指针时,只会调用析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。...,转换时执行必要检测(指针越界、类型检查),其操作数相对是安全 2)dynamic_cast:运行时检查 用于集成体系中进行安全向下转换downcast,即指针/引用->派生类指针/引用...; volatile属性转换 4)reinterpret_cast 通常为了一种数据类型转换成另一种数据类型 十九、引用作为函数参数以及返回值好处: 对比值传递,引用好处: 1)函数内部可以对此参数进行修改

1.2K31

构造与析构时候...

构造/析构函数执行顺序 继承机制对象之间如何转换? C++成员访问权限和继承权限问题 如何禁止程序自动生成拷贝构造函数?...---- 成员初始化列表概念,为什么用它会快一些构造函数,不在函数体内对成员变量赋值,而是构造函数花括号前面使用冒号和初始化列表赋值。...1、初始化一个const成员 2、调用构造函数参 3、初始化不存在默认构造函数别的对象 ---- 构造/析构函数执行顺序 构造时候:如果,先调用构造函数,再调用自己构造函数...三种继承方式 ① 若继承方式是public,成员派生类访问权限保持不变,也就是说,成员访问权限,派生类仍然保持原来访问权限; ② 若继承方式是private,所有成员派生类访问权限都会变为私有...(private)权限; ③ 若继承方式是protected,共有成员和保护成员派生类访问权限都会变为保护(protected)权限,私有成员派生类访问权限仍然是私有(private)

62120

C++面向对象编程一些拾遗

this成员函数开始执行构造成员执行结束后清除。 Q2:this指针如何传递给函数?绑定?还是函数参数参数就是this指针?...对于派生类来说,私有成员被继承之后派生类是无法使用,所以设计了保护成员来继承,公有继承之后还是保护派生类可以使用,而且可以继续派生,所以说保护成员是为了继承而生,这个说法也一点都不为过。...总的来说: 执行构造函数,当有多个时,按照定义时继承顺序来。 执行成员对象构造函数,当有成员是对象时,构造后,会调用成员对象构造函数进行构造执行派生类构造函数。...//鸟 也就是说,中间(我就这样做吧),不会去调用构造函数构造(因为是虚继承),最终派生类会调用构造函数构造,所以派生类构造函数上要加上构造函数!...我们定义了一个名为shape抽象用来继承shape派生类必须覆盖掉继承纯虚函数(因为抽象纯虚函数一般是不做定义,只是为了继承达到多态作用)。

64820

《逆袭进大厂》第三弹之C++提高篇79问79答

(2)抽象作用: 抽象主要作用是将有关操作作为结果接口组织一个继承层次结构,由它来为派生类提供一个公共根,派生类具体实现在其作为接口操作。...(3)使用抽象时注意: 抽象只能作为来使用,其纯虚函数实现由派生类给出。如果派生类没有重新定义纯虚函数,而只是继承纯虚函数,则这个派生类仍然还是一个抽象。...这就是纯虚函数作用。  纯虚函数可以让先具有一个操作名称,而没有操作内容,让派生类继承时再去具体地给出定义。 凡是含有纯虚函数叫做抽象。这种类不能声明对象,只是作为派生类服务。...2) 三种继承方式 ① 若继承方式是public,成员派生类访问权限保持不变,也就是说,成员访问权限,派生类仍然保持原来访问权限; ② 若继承方式是private,所有成员派生类访问权限都会变为私有...private,那么派生类编译器将不会自动生成这两个函数,且由于base函数是私有的,因此,派生类阻止编译器执行相关操作

2.2K30

《C++Primer》第十五章 面向对象程序设计

负责定义层次关系中所有共同拥有的成员,而每个派生类定义各自持有的成员。 C++类型相关函数派生类不做改变直接继承函数区分对待。...移动操作继承 前面提到,大多数都会定义一个虚析构函数,因此默认情况下通常不包含合成移动操作,而且派生类也没有合成移动操作。...当我们为派生类定义拷贝或者移动构造函数时,我们通常使用对应构造函数初始化对象部分: // 初始值Base(d)一个D对象传递给构造函数,Base(d)会去匹配Base拷贝构造函数...构造函数和析构函数调用虚函数 派生类对象部分首先被构造然后构造派生类部分。对象销毁顺序正好相反,派生类析构函数首先执行然后析构函数。...如果含有几个构造函数,则除了两个例外情况外大多数派生类继承所有的构造函数: 如果派生类定义构造函数构造函数有相同参数列表,则该构造函数不会被继承,定义派生类构造函数会替换继承而来构造函数

1.2K20

代码重用

保护继承列出时候使用关键子protected;保护继承使得公有成员和保护成员都将称为派生类保护成员,其与私有继承一样,接口派生类中都是可用,但是继承层次结构之外是不可用。...两者最大区别在于派生类再派生出另外一个时候,使用私有继承第三代将不能使用接口,因为公有方法第二代变成了私有方法;但是使用保护继承,第三代可以使用接口,因为第二代公有方法变成受保护...如果希望方法能够派生类外面可用的话,首先我们能想到派生定义一个公有方法,该方法调用方法,进而实现该效果。另外一种方法就是使用using重新定义访问权限。...是虚时候,Abc通过BaseA或BaseB构造函数参数信息间接传递给Base时将不起作用,c++是虚时候,禁止参数信息通过中间递给。...因此上述ba信息必不能传递给子对象Base,然而编译器会使用Base默认构造函数构造派生类对象之前构造对象组件。如果不希望使用默认构造函数构造函对象,则需要显式地调用构造函数

60140
领券