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

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

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

7110

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

一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生类需要声明自己构造函数。...声明构造函数,只需要对本类中新增成员进行初始化,对继承来成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...从输出可以看出: 派生类对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生类对象成员构造函数,最后是派生类自身构造函数。...初始化列表参数多个且其中有调用构造函数,先执行构造函数(从最远开始,如果多重继承则按继承顺序);其他对象成员若不止一个,则按定义顺序构造,与初始化列表顺序无关。...四、派生类转换 当派生类以public方式继承,编译器可自动执行转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为对象指针 派生类对象引用自动转化为对象引用

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

c++学习笔记4,调用派生类顺序构造和析构函数(一个)

大家好,又见面了,我是全栈君 测试源代码: //測试派生类构造函数调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include using namespace..."<<endl; A *a2=new A; //仅仅有在new 一个对象时候才会调用构造函数 cout<<"能够看到...a3也并没有调用构造函数"<<endl; A *a3=&a; B b; } 输出为: 能够看到,在创建派生类对象时候,首先调用构造函数,然后才是调用派生类自己构造函数...而在析构时候,顺序则刚好相反,先调用派生类析构函数,然后才是调用构造函数。这是由于对象创建时候对象存放在堆栈原因。(new 对象尽管是存在堆,可是在堆栈依旧存放其堆地址,因此。...析构时候也是一样) 那么,创建其对象数组:A a[2],是否会调用构造函数呢。这是肯定

67910

创建子类对象,父构造函数调用被子类重写方法为什么调用是子类方法?

static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象时候父调用子类方法...但是:创建B对象父调用方法? 答案: 当子类被加载到内存方法区后,会继续加载父到内存。...如果,子类重写了父方法,子类方法引用会指向子类方法,否则子类方法引用会指向父方法引用。 如果子类重载了父方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父方法,则方法引用会指向父方法。 当子类对象创建,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,父构造方法调用方法参数已经强制转换为符合父方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.1K10

第 15 章 面向对象程序设计

成员函数可以分为两: 虚函数,希望派生类进行覆盖函数,任何构造函数之外非静态函数都可以是虚函数。关键字 virtual只能出现内部声明语句之前而不能用于外部函数定义。...派生类应该遵循接口,通过调用构造函数来初始化那些从中继承而来成员。派生类初始化过程大致为:初始化——>构造函数体——>派生类初始化——>派生类构造函数体。...而对于非虚函数调用是在编译进行绑定。类似的,通过对象进行函数(虚函数或非虚函数调用也在编译绑定。 一旦某个函数被声明为虚函数,则在所有派生类它都是虚函数。...当构造函数具有默认实参,实参不会被继承,而是派生类会获得多个继承构造函数,每个构造函数分别省略掉一个含有默认实参形参。...派生类定义构造函数构造函数具有相同形参列表,则该构造函数不会被继承,派生类中使用是自己定义相应函数。 默认、拷贝和移动构造函数不会被继承,这些构造函数按照正常规则被合成。

1K30

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

三、构造函数初始化顺序 构造顺序与派生列表出现顺序有关,而与构造函数初始化列表初始化顺序无关 派生类构造自己之前同样需要构造对象。...using从继承构造函数概念 在C++11标准,允许派生类从它一个或几个中继承构造函数。...使用合成版本 如果派生类没有定义自己拷贝/赋值构造函数和赋值运算符,那么在执行这些操作将会自动调用拷贝/赋值构造函数和赋值运算符 七、派生类类型转换 与单一继承原理一致,可以将一个派生类赋值给一个...,派生类作用域嵌套在直接或间接作用域中,也就是说当我们查找一个数据成员/方法,在派生类不存在,那么就继续向中进行查找,如果查找到了就进行使用 多重继承下派生类作用域嵌套在所有的或间接作用域中...二义性与二义性解决 当同一个数据成员/函数名称在不同出现时,程序不会出现错误(编译器允许定义)。

91130

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

子对象 Panda::Panda() : Endangered(Endagered::critical) { } 其中构造顺序与派生列表出现顺序保持一致,而与派生类构造函数初始值列表顺序无关...// D2一旦定义了它自己构造函数, 则必须出现 }; 1.3 析构函数与多重继承 派生类析构函数只负责清除派生类本身分配资源,派生类成员以及都是自动销毁。...析构函数调用顺序正好与构造函数相反,在上面的例子析构函数调用函数是: ~Panda ~Endangered ~Bear ~ZooAnimal 1.4 多重继承派生类拷贝与移动操作 与只有一个继承一样...构造函数与虚继承 在虚派生,虚是由最低层派生类初始化。以我们程序为例,当创建Panda对象,由Panda构造函数独自控制ZooAnimal初始化过程。...如果ZooAnimal没有默认构造函数,那么代码将发生错误。 虚总是先于非虚构造,与它们在继承体系次序和位置无关。

1.3K20

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

,对内置类型不做处理,对自定义类型调用默认构造函数,规则和以前一样 派生类里面,把父成员当做一个整体 派生类构造函数必须调用构造函数初始化那一部分成员。...,父调用构造函数初始化 成员变量初始化顺序是根据它们在定义中出现顺序,而不是初始化列表顺序。...因此,构造函数总是首先被调用,再是派生类定义成员变量 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化,一般情况下默认生成就够用,如果涉及到深拷贝,就需要自己显示实现 Student...这样设计可以防止成员被重复释放或者提前释放,从而导致潜在错误和资源泄漏 派生类对象初始化:先调用构造再调派生类构造 派生类对象析构清理:先调用派生类析构再调析构。...因此,无论是在还是派生类访问静态成员,访问都是同一个数据。在设计层次结构,这一点非常重要,因为静态成员行为可能会影响整个

10310

C++基础-继承

而当作用于构造函数,using 声明语句将令编译器生成代码。对于每个构造函数,编译器都在派生类中生成一个形参列表完全相当构造函数。...,派生类构造函数会隐式调用默认构造函数,这由编译器实现,不需编写调用代码; 如果没有默认构造函数,即提供了重载构造函数,则派生类构造函数通过初始化列表来调用构造函数,这属于显式调用。...这种方式是必需,否则编译器会试图调用默认构造函数,而并无默认构造函数,编译会出错; 在派生类构造函数,使用 ::Base() 形式显示调用构造函数。...如果包含重载构造函数,需要在实例化时给它提供实参,则创建派生类对象,可以使用初始化列表,并通过派生类构造函数调用合适构造函数。...例如,公有成员遇到私有继承,就变成派生类私有成员;保护成员遇到公有继承,就变成派生类保护成员;私有成员派生类不可见。

96120

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

而对于自定义类型,它们会自动调用构造和析构函数,如果是别的自定义类型,则会到它们自己中去调用它们构造和析构函数。在多态构造,然后再是派生类构造。...这样做好处是,如果有人在调用了这些被私有化函数,或者使用友元,那么会在连接期出现错误,而并非编译期错误。如果是发生在连接期错误,这种错误很难侦测出来!...() { Corgi co; return 0; } 分析代码: 代码,用派生类创建了一个派生类对象,在构造函数调用时候,会先去构造成分,然后才会去构造派生类从成分,这就意味着,会先去调用构造函数...构造函数最后会去执行count_Dog函数,问题就出现在这里,上面说了,构造函数构造期间,virtual函数不会下降到派生类,也就是说即使我们创建对象属于派生类,但是在调用构造函数期间...做法就是在派生类拷贝构造函数和赋值重载调用拷贝构造和赋值函数

34310

第 18 章 用于大型程序工具

搜寻匹配 catch语句过程,寻找是第一个与异常匹配 catch语句,是按照其出现顺序逐一进行匹配,当程序使用具有继承关系多个异常,要注意令派生类异常处理代码出现异常处理代码之前...构造顺序与派生类列表出现顺序保持一致,而与派生类构造函数初始值列表顺序无关。...在 C++11新标准,允许派生类从它一个或几个中继承构造函数,但是如果从多个中继承了相同构造函数(即形参列表完全相同),则程序将产生错误。...自定义拷贝/赋值构造函数和赋值运算符都需要显式调用相应成员来完成派生类对象拷贝、移动和赋值操作。只有当派生类使用是合成版本函数,才会自动对齐部分执行相应操作。...含有虚对象构造顺序与一般顺序稍有区别:首先使用提供给最低层派生类构造函数初始值初始化该对象子部分,接下来按照直接在派生列表中出现次序依次对其进行初始化。

89620

关于Java构造函数(Constructor)常见问题总结1 为什么调用子类构造方法时候,默认会调用构造方法2 常见错误:Implicit super constructor is und

Must define an explicit constructor 这个错误是很多开发者经常遇到错误错误原因就是找不到超默认构造函数。...编译器错误是因为默认super()无参构造函数是没有定义。在Java,如果一个没有定义构造函数,编译器会自动插入一个默认无参构造函数。...上一小节,我们知道,如果子类构造函数,没有显示调用构造函数,那么,编译器就会插入super(),也就是自动调用无参构造函数。但是此时,父没有无参构造函数,所以就会报错了。...解决这个问题很简单,我们可以给父插入一个无参构造函数,或者在子类构造函数显示调用有参构造函数。 在子类构造函数显示调用构造函数 下面的代码是正确。 ?...有一个原因就是,如果我们给所有的都自动实现一个无参构造函数,就可能出现问题,会打破设计原则。

2.7K30

C++一分钟之-继承与多态概念

常见问题与易错点访问权限:派生类可能无法访问私有成员,导致误解。记住,只有公有和保护成员才能被继承。构造函数与析构函数构造函数和析构函数不会自动被调用,需要显式调用或使用初始化列表。...在派生类构造函数,使用初始化列表显式调用构造函数。多重继承考虑菱形问题,适时使用virtual关键字。...在C++,主要通过虚函数实现多态,使得派生类可以根据自身情况重写函数。...常见问题与易错点忘记使用virtual关键字:如果函数没有声明为虚函数派生类即使重写了该函数,也无法实现动态绑定。切片问题:当将派生类对象赋值给对象派生类特有的部分会被“切片”掉。...空指针调用函数:对空指针调用函数会导致运行时错误。如何避免确保需要被重写函数声明为虚函数。使用引用或指针处理派生类关系,避免切片问题。在调用函数前检查指针是否为空。

8610

第 18 章 用于大型程序工具

搜寻匹配 catch语句过程,寻找是第一个与异常匹配 catch语句,是按照其出现顺序逐一进行匹配,当程序使用具有继承关系多个异常,要注意令派生类异常处理代码出现异常处理代码之前...构造顺序与派生类列表出现顺序保持一致,而与派生类构造函数初始值列表顺序无关。...在 C++11新标准,允许派生类从它一个或几个中继承构造函数,但是如果从多个中继承了相同构造函数(即形参列表完全相同),则程序将产生错误。...自定义拷贝/赋值构造函数和赋值运算符都需要显式调用相应成员来完成派生类对象拷贝、移动和赋值操作。只有当派生类使用是合成版本函数,才会自动对齐部分执行相应操作。...含有虚对象构造顺序与一般顺序稍有区别:首先使用提供给最低层派生类构造函数初始值初始化该对象子部分,接下来按照直接在派生列表中出现次序依次对其进行初始化。

97950

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

前者通常将其定义为虚函数virtual,当我们使用指针或者引用调用函数,该调用将被动态绑定 任何构造函数之外非静态函数都可以是虚函数 如果把一个函数声明成虚函数,那么该函数派生类隐式地也是虚函数...当我们delete一个动态分配对象指针将执行析构函数,如果该指针指向继承体系某个类型,那么可能出现指针静态类型与被删除对象动态类型不符合情况。...、赋值或者销毁操作 如果在中有一个不可访问或者删掉析构函数,则派生类合成默认和拷贝构造函数将是被删除,原因是编译器无法销毁掉派生类部分 当我们使用=default请求一个移动操作,如果对应操作是删除或者不可访问...在构造函数和析构函数调用函数 派生类对象部分首先被构造,然后再构造派生类部分。对象销毁顺序正好相反,派生类析构函数首先执行,然后是析构函数。...当执行构造函数,该对象派生类部分是未被初始化状态;当执行析构函数派生类部分已经被销毁了。

1.2K20

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

图4-8 派生类构造函数调用顺序 4.2.10 派生类构造函数使用应注意问题 派生类构造函数定义可以省略对构造函数调用,其条件是在必须有缺省构造函数或者根本没有定义任何构造函数(编译器会自动生成缺省构造函数...图4-12 多继承构造函数调用顺序 4.3 二义性问题 原因:在多继承情况下,造成某个成员访问出现不唯一情况 4.3.1 成员函数二义性 ?...,则对该说明成员进行访问,可能会出现二义性 4.3.2 成员变量二义性 ?...图4-16 虚与非虚存储结构 4.4.2 虚构造函数 派生类只有一个虚子对象 虚构造函数必须只被调用一次,目的是要保证虚子对象只被初始化一次 最派生类:继承结构建立对象所指定...虚子对象由最派生类构造函数通过调用构造函数进行初始化 在一个成员初始化列表中出现对虚和对非虚构造函数调用时,虚构造函数先于非虚构造函数执行 最派生类构造函数成员初始化列表必须给出对虚构造函数调用

60720

C++之继承

派生类定义与父类同名成员派生类将屏蔽对该成员直接访问,称这种情况为隐藏。而派生类同名成员是对成员重写/重定义。...fun函数并不构成重载,因为他们在不同作用域,他们是隐藏关系 四、派生类默认成员函数 1.构造函数 派生类构造函数必须调用构造函数初始化那一部分成员,如果没有默认构造函数派生类就必须在初始化列表处显示调用构造函数...派生类对象初始化时,会先调用构造函数,再调用派生类构造函数。 2.拷贝构造 必须调用拷贝构造完成部分拷贝构造。...4.析构函数 派生类额析构函数会在调用结束后自动调用析构函数清理成员,确保先清理派生类成员再清理成员析构顺序。 派生类对象析构先调用派生类析构函数调用析构函数。...3.菱形继承 由于C++支持多继承,因此可能会出现菱形继承(一个派生类继承多个拥有共同情况。

39610

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

一、继承构造函数 根据构造函数执行流程我们知道: 派生类定义,先执行构造函数,再执行派生类构造函数 拷贝构造函数与上面是相同原理 二、继承析构函数 根据析构函数执行流程我们知道:...派生类释放,先执行派生类析构函数,再执行析构函数 二、继承中被删除函数语法 派生类可以将其构造函数或者拷贝控制成员定义为删除。...当我们使用=default请求一个移动操作,如果对应操作是删除或不可访问,那么派生类函数是被删除,原因是派生类对象部分不可移动。...} }; 五、特别注意:在构造函数和析构函数调用函数 根据构造函数,析构函数我们知道: 派生类构造,先构造部分,然后再构造派生类部分 派生类析构,先析构派生类部分,然后再析构部分 因此...: 在构造函数执行时候,派生类部分是未定义状态 在析构函数执行时候,派生类部分已经被释放了 所以在构造函数或析构函数调用函数是不建议,因为: 虚函数在执行时候可能会调用到属于派生类成员

1.3K30

【笔记】《C++Primer》—— 第18章:用于大型程序工具

要注意构造顺序是与派生列表出现顺序一致,与派生类参数顺序无关 C11允许派生类从多个中继承构造函数,但是如果多个构造函数都相同的话将产生错误,此时派生类应该自己定义一个构造函数来覆盖它们...析构函数调用顺序与构造顺序相反特性仍在 合成拷贝移动等操作规则也与之前一致 我们可以用指针指向派生类对象,但是调用对应函数时候编译器不会觉得不同方向转换有好坏之分,因此当有多个接受不同参数但名字相同函数...,如果我们直接调用函数传递派生类对象进去,会产生二义性错误,需要用特质来解决 和单继承一样,静态类型决定了我们能调用那些成员 在多继承时候,名称查找会在所有直接同时进行,单个继承链上才有顺序,...此时如果名字在多个中被同时找到,则名字会有二义性,因此最好我们调用函数也要特指 和之前一样,先找名字再类型检查,因此名字相同就已经会发生二义性错误了 尽管派生类中直接只能出现一次,但显然我们可以间接继承多次相同...但是如果两个直接都继承了虚同一个对象,任何派生类再继承这两个,那么调用这个对象时会产生歧义因为这个对象被两个重新继承了,最好解决方法仍然是在派生类再继承一次对象指明好对象来源 在虚派生

95320

【C++深度探索】继承机制详解(一)

派生类构造函数必须调用默认构造函数初始化那一部分成员。...如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用构造函数。...例如: 当我们将默认构造函数缺省值"tutu",去掉,它就不再是默认构造函数,那么在创建子类Student对象就不会自动调用默认构造函数,会保错,那么这时我们就需要在初始化列表里显示调用...: 这种情况是不可取,这是因为规定在初始化列表是不可以使用父成员 ✨拷贝构造 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。...✨析构函数 派生类析构函数会在被调用完成后自动调用析构函数清理成员。因为这样才能保证派生类对象先清理派生类成员再清理成员顺序。

6510
领券