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

派生函数和非虚函数继承效果

而虚函数作用,主要是为了让父指针可以调用子类函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++函数主要作用是“运行时多态”,父中提供虚函数实现,为子类提供默认函数实现。...子类可以重写父函数实现子类特殊化。 2、纯虚函数:   C++包含纯虚函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数子类才能new出对象。   ...C++纯虚函数更像是“只提供申明,没有实现”,是对子类约束,是“接口继承”。   C++纯虚函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

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

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

一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承构造函数 构造函数不被继承派生需要声明自己构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...输出可以看出: 派生对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生对象成员构造函数,最后是派生自身构造函数。...初始化列表参数多个且其中有调用构造函数时,先执行构造函数最远开始,如果多重继承则按继承顺序);其他对象成员若不止一个,则按定义顺序构造,与初始化列表顺序无关。...向下转型不安全,没有自动转换机制 // 语法上来演示对象可以转化为派生对象,但是没有意义 1、转换构造函数: Manager(const Employee& other) : Employee

1.5K00

C++同时存在继承以及组合时候,构造函数构造顺序

C++一大特点就是面向对象,面向对象主要就是一些相关特性(封装、继承、多态)。 那么在继承以及成员属性包含其他实例对象时候,构造函数构造顺序到底是怎么样子呢?...那么当一个对象既包含了继承关系同时也在自身成员属性包含了其他对象实例化时候,那么这时候实例化该类对象时候,构造函数顺序会是怎么样子呢?下面来看看这一段代码吧。...private: int i_b; }; class C :public A{ // C继承A(C:派生、子类;A:) public: C() { cout...c; // 实例化一个C对象 system("pause"); return 0; } 这就是一个简单继承加上组合小demo,从上面的小demo可以看出C继承...A 构造函数 B 构造函数 C 构造函数 构造顺序是首先构造继承,其次构造组合实例对象,最后才是构造自己本身。

1.1K20

【Kotlin】初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数定义成员属性 | 次构造函数 | 构造函数默认参数 )

文章目录 一、主构造函数定义临时变量 二、主构造函数定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- 在 Kotlin , 可以在 声明 时 在 名后...定义 " 主构造函数 " ; 在 主构造函数 , 可以 定义 成员属性 , 并为 成员属性 提供 初始值 ; 在 主构造函数 , 可以定义 临时变量 , 临时变量 一般使用 以下划线为开头 名称...---- 在主构造函数 定义临时变量 , 格式为 : class 名(_临时变量名: 临时变量类型){} 在主构造函数也可以 定义成员属性 , 格式为 : class 名(var 成员属性名:..., 每个次构造函数都可以有不同参数组合 ; 定义次构造函数后 , 必须调用主构造函数 , 并且为每个主构造函数 参数设置 参数值 ; 次构造函数可以实现代码逻辑 , 作为主构造函数补充 ; 代码示例...: 下面代码 , 次构造函数 必须 调用主构造函数 , name 和 age 参数必须设置默认值 name = "Jerry", age = 12 ; class Hello( // 主构造函数

4.8K20

C++ 一篇搞懂继承常见特性

---- — 5 — 派生构造函数 通常在初始化派生构造函数时,派生构造函数是要实现初始化构造函数。...那么如何在派生构造函数初始化构造函数呢?...第24-30行派生构造函数初始化是错误方式,因为私有成员是无法被派生访问,也就无法初始化。...第33-36行代码是正确派生构造函数初始化构造函数方式,通过调用构造函数初始化,在执行一个派生构造函数 之前,总是先执行构造函数。...从上面的例子我们也得知构造派生对象前,是先构造对象,那么在析构时候依然依据“先构造,后初始化原则,所以派生析构时,会先执行派生析构函数,再执行析构函数

54830

【C++】继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 父指针 指向 子类对象 | 使用 子类对象 为 父对象 进行初始化 )

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父 : 需要 ( 父 ) 对象...地方 , 都可以使用 " 公有继承 " 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 派生 ( 子类 ) 本质上 具有 ( 父 ) 完整功能 , 使用 可以解决问题 , 使用 公有继承派生 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 派生 , 是 不具有 完整功能 , 因为 最终继承派生 , 无法在 外部调用 父 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...); } 2、使用 子类对象 为 父对象 进行初始化 定义父对象 , 可以直接使用 子类对象 进行初始化操作 ; // II.

22620

C++虚拟继承与虚

多重继承使得派生关系变得更为复杂,其中一个容易出现问题是某个沿着不同路径被派生继承(即形成所谓“菱形继承”),从而导致一个派生对象存在同一个对象多个拷贝。...image.png 多重继承带来同一个对象在派生对象存在多个拷贝问题,考察如下代码。...2.如何在派生只保留一份拷贝 逻辑上说,一个在职研究生只可能有一个名字和一个身份证号码,所以在一个EGStudent对象中有IDPerson和Name字段两个拷贝是不合理,只需要一个拷贝就可以了...(4)虚拟继承,虚对象是由最远派生构造函数通过调用虚构造函数进行初始化派生构造函数成员初始化列表必须列出对虚构造函数调用;如果未列出,则表示使用该虚缺省构造函数。...因为虚拟继承只是表名某个对象在派生对象只被构造一次,而在本例Student和Employee对象在EGStudent对象本来就不会被构造多次,所以不将它们申明虚也是完全可以

86520

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

图4-1 派生构成 4.2 单继承与多继承继承:从一个派生继承继承多个派生继承 ? 图4-2 单继承与多继承 4.2.1 单继承 格式: ?...,与派生构造函数中所定义成员初始化列表各项顺序无关 4.2.11 示例 ?...图4-13 成员函数二义性 解决方法:1区别出是A或Bf函数,c1.A::f()或c1.B::f()                 2在定义同名函数f 当一个派生多个派生,而这些又有一个共同...图4-16 虚与非虚存储结构 4.4.2 虚构造函数 派生只有一个虚子对象 虚构造函数必须只被调用一次,目的是要保证虚子对象只被初始化一次 最派生继承结构建立对象时所指定...虚子对象由最派生构造函数通过调用虚构造函数进行初始化 在一个成员初始化列表中出现对虚和对非虚构造函数调用时,虚构造函数先于非虚构造函数执行 最派生构造函数成员初始化列表必须给出对虚构造函数调用

60420

C++11继承构造函数

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

1.9K20

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

新标准允许派生显式地注明它使用某个成员函数覆盖了它继承函数,做法是添加一个关键字override 2.1 派生构造函数 尽管在派生对象中含有继承而来成员,但是派生并不能直接初始化这些成员...尽管语法上来说我们可以在派生构造函数体内给它共有或受保护成员赋值,但最好不要这么做。 2.3 继承与静态成员 如果定义了一个静态成员,则在整个继承体系只存在该成员唯一定义。...派生构造函数初始化直接 如果一个派生类同时包含直接和间接,那么该派生构造函数只需要初始化直接。 访问控制和继承 1....一往常,名字查找先于类型检查 声明在内层作用域函数并不会重载声明在外层作用域函数。因此定义派生函数也不会重载其成员。...派生拷贝控制成员 派生构造函数在其初始化阶段不但要初始化派生自己成员,还要负责初始化派生对象部分。

1.2K20

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

Endangered 最后初始化Panda 1.2 继承构造函数与多重继承 在C++11新标准,允许派生一个或几个继承构造函数。...using Base2::Base2; // Base2继承构造函数 // 补救方法: 如果一个多个继承了相同构造函数, 则这个必须为该构造函数定义它自己版本...Panda继承体系.png 虚派生只影响指定了虚派生中进一步派生,它不会影响派生本身。...构造函数与虚继承 在虚派生,虚是由最低层派生初始化。以我们程序为例,当创建Panda对象时,由Panda构造函数独自控制ZooAnimal初始化过程。...当然,继承体系每个都可能在某个时刻成为“最底层派生”。只要我们能创建虚派生对象,该派生构造函数就必须初始化

1.3K20

C++基础(四).继承

-- 继承 继承是一种联结层次模型,并且允许和鼓励重用,它提供了一种明确表述共性方法 对象一个新可以现有的派生,这个过程称为继承。...新继承了原始特性,新称为原始派生(子类),而原始称为新(父派生可以那里继承方法和实例变量,并且可以修改或增加新方法使之更适合特殊需要。...,注意调用构造方法 { title=ttitle; //因为已经使用构造将其它成员变量初始化了,只用将这额外属性进行单独初始化就够了,这即是继成一个好处,代码复用 } void Teacher...,注意通过调用构造方法来初始化变量 { wages=vwages; //因为已经使用构造将其它成员变量初始化了,只用将这额外属性进行单独初始化就够了,这即是继成一个好处,代码复用 }...析构函数根据变量生命周期,作用域,堆内申请和栈内申请不同,触发时机也不尽相同,需要对内存回收时间有一定认识才能准确判断 派生调用进行初始化时,其实现顺序应该和声明顺序一致,否则会出编译错误

43720

【C++高阶】C++继承学习手册:全面解析继承各个方面

因此,本文将带领大家多个角度全面学习C++继承,包括继承语法规则、访问控制、构造函数与析构函数调用、多重继承与菱形继承等问题 让我们一起踏上学习C++继承旅程吧! 1....派生默认成员函数 默认成员函数 默认成员函数,“默认”意思就是指我们不写,编译器会变我们自动生成一个 相关文章:默认成员函数 派生默认函数特征 派生构造函数必须调用构造函数初始化那一部分成员...如果没有默认构造函数,则必须在派生构造函数初始化列表阶段显示调用 派生拷贝构造函数必须调用拷贝构造完成拷贝初始化 派生operator=必须要调用operator=完成复制...因为这样才能保证派生对象先清理派生成员再清理成员顺序 派生对象初始化先调用构造再调派生构造 派生对象析构清理先调用派生析构再调析构 因为后续一些场景析构函数需要构成重写,重写条件之一是函数名相同...总结 回顾学习过程,我们学会了如何定义派生,掌握了访问控制规则,理解了构造函数与析构函数继承作用,还探讨了多重继承及其带来挑战。

12010

【C++ 进阶】继承

private成员在派生无论以什么方式继承都是不可见;     不可见指:私有成员还是被继承到了派生对象,但是语法上限制派生对象不       管在里面还是外面都不能去访问它...; 2.如果想要在派生访问成员变量,可以在定义为 protected 成员; 3.其他成员在子类访问方式 == Min(成员在访问限定符,继承方式); 4.使用关键字...但是必须是指针是指向派生对象时才是安全; 四.隐藏(重定义) 1.子类和父,只要函数名相同就构成隐藏; 2.成员名相同也构成隐藏; 3.在子类成员函数,可以使用 ::成员...五.派生默认成员函数 1.构造函数  派生必须先自动调用默认构造初始化那一部分成员),如果没有默     认构造,就要在派生初始化列表阶段显式调用构造函数,然后派生调用自己...2.拷贝构造    派生拷贝构造必须先调用拷贝构造完成拷贝初始化。 3.赋值重载    派生赋值重载必须先调用赋值重载完成复制。

11710

【笔记】《C++Primer》—— 第15章:面向对象程序设计

如果是指针或引用转换,则只是一个指向改变 派生构造函数需要负责所有成员初始化,尽管派生也可以初始化继承成员,但是这不符合通常编码思路,派生一般在构造函数开始地方调用构造函数...,这一项决定派生继承成员对外表现出最高权限,也就是这一项并不会影响派生内部使用,但是一旦外部想调用派生来使用成员: 如果此时访问说明符为public,则成员对外表现权限 如果此时为...为了规范和可读性,最好不要利用默认控制符,显式说明比较清晰 15.6 继承作用域 名字查找是内到外查找,当派生无法找到时,就会往直接查找,以此类推 名称查找是根据编译时目标的静态类型进行查找...拷贝构造派生时,假如我们成员没有被我们初始化的话,那些成员将被默认初始化而非拷贝。...或constexpr,而是这个构造函数继承声明属性 当构造函数中有默认实参时,这些实参不会被继承,而是派生会得到多个继承构造函数,每个构造函数省略一个有默认实参形参 大多数时候派生继承所有构造函数

50720

一文让你学完C++,干货收藏!!!

& 派生 一个可以派生自多个,这意味着,它可以多个继承数据和函数。定义一个派生,我们使用一个派生列表来指定。...一个派生继承了所有的方法,但下列情况除外: 构造函数、析构函数和拷贝构造函数。...重载运算符。 友元函数继承类型 当一个派生,该可以被继承为 public、protected 或 private 几种类型。...当使用不同类型继承时,遵循以下几个规则: 公有继承(public):当一个派生自公有时,公有成员也是派生公有成员,保护成员也是派生保护成员,私有成员不能直接被派生访问...C++ 可以多个继承成员,语法如下: class :,,… { }; 其中,访问修饰符继承方式是 public、protected

3.3K20

【C++】三大特性之继承

继承定义 2.1定义格式 2.2继承关系和访问限定符 2.3继承成员访问方式变化 二、派生对象赋值转换 三、继承作用域 四、派生默认成员函数 五、友元与继承 六、继承与静态成员 七...int main() { Student s1; s1.Person::Print(); return 0; } ---- 四、派生默认成员函数 派生构造函数必须调用构造函数初始化那一部分成员...如果没有默认构造函数,则必须在派生构造函数初始化列表阶段显示调用。 派生拷贝构造函数必须调用拷贝构造完成拷贝初始化。...因为这样才能保证派生对象先清理派生成员再清理成员顺序。 派生对象初始化先调用构造再调派生构造派生对象析构清理先调用派生析构再调析构。..._name时候,我们需要用到Person构造函数,因为我们没有默认构造函数,所以我们需要在初始化列表里面显式调用。

33920

【C++】继承

通过继承联系在一起构成一种层状结构,通常在层状结构根部有一个,其他直接或间接继承而来,这些继承得到称为派生。...要注意是第三条,如果派生函数名相同但参数不同,不会构成函数重载,也派生对象也无法调用函数,如下: class A { public: void fun(int c) {...派生构造函数必须调用构造函数初始化那一部分成员。如果没有默认构造函数,则必须在派生构造函数初始化列表阶段显示调用。 2....派生拷贝构造函数必须调用拷贝构造完成拷贝初始化。 3. 派生operator=必须要调用operator=完成复制。 4....派生对象初始化 先调用构造再调派生构造 。 6. 派生对象析构清理 先调用派生析构再调析构 。 7.

9110

2W五千字C++基础知识整理汇总

& 派生 一个可以派生自多个,这意味着,它可以多个继承数据和函数。定义一个派生,我们使用一个派生列表来指定。...一个派生继承了所有的方法,但下列情况除外: 构造函数、析构函数和拷贝构造函数。...重载运算符。 友元函数继承类型 当一个派生,该可以被继承为 public、protected 或 private 几种类型。...当使用不同类型继承时,遵循以下几个规则: 公有继承(public):当一个派生自公有时,公有成员也是派生公有成员,保护成员也是派生保护成员,私有成员不能直接被派生访问...C++ 可以多个继承成员,语法如下: class :,,… { }; 其中,访问修饰符继承方式是 public、protected

2.6K10
领券