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

继承

派生类之间关系: 派生类对象可以使用(公有的)方法。 指针可以在不进行显示类型转换情况下指向派生类对象,但只能调用方法。...且该转换是可以传递,例如A,其派生类AP,AP派生类APP,则A指针或引用可以指向或引用AP对象和APP对象。 相反,我们将指针或引用转换为派生类指针或引用称为向下强制转换。...虚函数表存储了为对象进行声明虚函数地址。通常情况下,对象包含一个指向该类虚函数表指针。...在派生类对象中将包含一个自己虚函数表,如果派生类没有重新定义虚函数,则派生类虚函数列表保函数原始版本地址;如果派生类提供了虚函数新定义,则该虚函数列表对应位置将保存新函数地址;如果派生类新增加虚函数...虚函数工作过程可以看出,使用动态联编能够让程序能选择特定类型设计方法,提高了代码灵活性和抽象性。但同时在内存和执行速度方面增加了一定成本。因此在实际开发过程中选择合适联编功能。

68220

【C++】继承

---- 二、派生类对象赋值 在继承关系派生类对象可以直接赋值给对象/指针/引用,而不产生类型转换。...如图所示:派生类对象赋值给对象时是直接将派生类属于那一部分切割给,引用和指针也是一样,引用是派生类属于那一部分成员别名,指针指向派生类属于那一部分。...,所以我们需要使用 const 修饰; 派生类对象赋值给对象不存在类型转换 现在,我们就能真正理解 “派生类对象可以直接赋值给对象/指针/引用,而不产生类型转换” 是什么意思了...如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用构造函数。 2、派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。...– B 继承来成员、 C 继承来成员以及 D 自身成员;同时,由于 B 和 C 同时继承自 A,所以 D 对象存在两份 A 成员,从而造成数据冗余和二义性。

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

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

除非在派生类完全实现中所有的纯虚函数,否则,派生类也变成了抽象,不能实例化对象。 二、纯虚函数引入原因 1、为了方便使用多态特性,我们常常需要在定义虚拟函数。...2) 多重继承优点很明显,就是对象可以调用多个接口; 3) 如果派生类所继承多个有相同,而派生类对象需要调用这个祖先接口方法,就会容易出现二义性 4) 加上全局符确定调用哪一份拷贝...指针,加上指针大小; 4) 当该该类是某类派生类,那么派生类继承部分数据成员也会存在在派生类空间中,也会对派生类进行扩展。...list项目顺序是由成员声明顺序决定,不是初始化列表排列顺序决定。 162、构造函数执行顺序是什么?...1) 在派生类构造函数,所有的虚及上一层构造函数调用; 2) 对象vptr被初始化; 3) 如果有成员初始化列表,将在构造函数体内扩展开来,这必须在vptr被设定之后才做; 4)

2.2K30

第 15 章 面向对象程序设计

第 15 章 面向对象程序设计 标签: C++Primer 学习记录 继承 派生 虚函数 ---- 第 15 章 面向对象程序设计 15.1 OOP:概述 15.2 定义派生类 15.3 虚函数...也正是因为在派生类对象中含有与其对应组成部分,所以能把派生类对象当成对象来使用,也因此能将指针或引用绑定到派生类对象部分上。这种转换也叫做派生类类型转换。...对于定义静态成员,因为它属于类型,而不是对象,则在整个继承体系只存在该成员唯一定义。不论中派生出来多少个派生类,对于每个静态成员来说都只存在唯一实例。...即使一个指针或引用已经绑定在一个派生类对象上,也不能执行派生类转换。可以使用 dynamic_cast执行运行时安全检查或 static_cast来强制覆盖掉编译器检查工作。...如果我们通过引用或指针调用函数,即使实际运行派生类函数版本,其使用也是定义默认实参。 有时候我们希望对虚函数调用不要进行动态绑定,而是强迫其执行虚函数某个特定版本。

99130

浅谈C++多态性

大家,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。 C++编程语言是一款应用广泛,支持多种程序设计计算机编程语言。...而p->fun()指针指针,指向fun是一个虚函数,因为每一个虚函数都有一个虚函数列表,此时p调用fun()并非直接调用函数,而是通过虚函数列表找到相应函数地址,因此依据指向对象不同,函数地址也将不同...并非非常理解这样使用方法,原理上来解释,因为B是子类指针,尽管被赋予了对象地址,可是ptr->foo()在调用时候,因为地址偏移量固定,偏移量是子类对象偏移量,于是即使在指向了一个对象情况下...而ptr->fun()调用,可能还是由于C++多态性原因,由于指向是一个对象,通过虚函数列表引用,找到了fun()函数地址,因此调用了函数。...C++纯虚函数 一、定义 纯虚函数是在声明虚函数,它在未定义,但要求不论什么派生类都要定义自己实现方法。

35410

【C++】从零开始认识继承

通过继承联系在一起构成一种层次关系,通常在层次关系根部有一个(base class),其他则是直接或间接地继承过来,这些继承来成为派生类(derived class)。...负责定义在层次关系中所有共同拥有的成员,而每个派生类都有各自特定成员。...指针 指针就是将子类地址赋值给指针。 注意: 派生类对象 可以赋值给 对象 / 指针 / 引用。这里有个形象说法叫切片或者切割。...寓意把派生类那部分切来赋值过去。 对象不能赋值给派生类对象指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须是指针是指向派生类对象时才是安全。...总结 派生类默认成员函数注意事项: 派生类构造函数必须调用构造函数初始化那一部分成员。如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用。

5110

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

是唯一能做到这一点新式转型符 dynamic_cast: 安全下转型(动态转型). 是运行时类型识别(RTTI)一大工具, 可以将引用, 指针, 右值引用转到派生类....令一种是写为一个纯虚, 所有接口都是纯虚函数用来多态调用实现具体函数. 实现头文件: 以工厂模式扮演具现化对象目标, 都有一个static初始化函数以供接口获得指向自己指针....(name-hiding), 至于这两个名称类型是否相同并不被考虑 这是非常危险特性, 如下图派生类mf3函数会将两个mf3一起进行遮掩, 无论那两个函数类型和形式是什么 因此对于公有继承来说...protected NVI手法还可以进一步扩展为实现策略设计模式函数指针方法, 使用函数指针来替代虚函数, 这让我们可以动态改变每个对象某个行为 但是仅用函数指针还是太笨拙了, 使用标准库模板std...函数 非虚函数继承是静态绑定, 因此如果我们用指针指向派生类对象, 然后调用这个非虚函数, 或者反之操作, 都只会调用指针本身声明那个类型下函数, 无关其实际对象类型 相类似的, 函数参数和引用在这类场景下也会产生相似的效果

87730

C++进阶-继承

九、继承相关面试题 零、前言 本章开始,我们已经达到了C++入门水平,开始向进阶进发,而本章则是介绍学习C++继承 一、继承概念和定义 概念: 继承(inheritance)机制是面向对象程序设计使代码可以复用最重要手段...private成 员 private成员 在派生类不可见 在派生类不可见 在派生类不可见 总结: private成员在派生类无论以什么方式继承都是不可见(不可见指私有成员还是被继承到了派生类对象...,实际扩展维护性不强 ) 二、派生类对象赋值转换 概念: 派生类对象可以赋值给对象/指针/引用,也叫切片或者切割,即把派生类那部分切来赋值过去 对象不能赋值给派生类对象指针...: 假设B继承了A,每个B对象就是一个A对象(每个派生类对象都是一个对象) 继承允许你根据实现来定义派生类实现 在继承方式内部细节对子类可见 继承一定程度破坏了封装...组合相当于每个派生类对象有一个对象;组合内部具体实现对派生类不可见(封装性),实现和派生类实现依赖性低(耦合度低,利于维护) 使用情形: 如果类型之间关系符合强相关,或者需要实现多态

42750

C++primer学习笔记(六)

virtual函数是希望派生类重新定义函数,希望派生类继承函数不能为虚函数。根一般要定义虚析构函数。 派生类只能通过派生类对象访问protected成员,不能用对象访问。...定义为virtual就一直为虚函数,派生类写不写virtual都是虚函数。用做必须是已定义。 存在虚函数+指针或引用==产生多态。非虚函数编译时就按指针或引用或对象类型确定。...派生类继承访问控制标号【何种方式继承】无论是什么,不影响派生类使用成员,但影响使用派生类用户访问成员。使用接口继承还是实现继承对派生类用户具有重要含义。 友元关系不继承。...构造函数无法继承,派生类构造数还要初始化【否则只能用合成构造函数初始化】。初始化列表和初始化顺序无关。只能初始化直接。...纯虚函数==抽象==无法创建对象 派生类对象复制到派生类对象将被切掉【而指针和引用不会】。

1.1K20

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

第十五章 面向对象程序设计 概述 面向对象程序设计object-oriented programming核心思想是数据抽象、继承和动态绑定: 使用数据抽象,我们可以将接口与实现分离 使用继承可以定义相似的类型并对其相似关系建模...有一点需要注意是,即使一个指针或者引用绑定在一个派生类对象上,我们也不能执行派生类转换: Bulk_quote bulk; Quote *itemP = &bulk; //...公有、私有和受保护继承 某个对继承而来成员呢访问权限收到两个因素影响:一个是该成员访问说明符,第二个是在派生类派生列表访问说明符。...虚函数与作用域 名字查找先于类型检查我们可以得知为什么派生类虚函数为什么必须有相同形参列表了。...有一些情况下一个仅仅需要覆盖重载集合一些而非全部函数,一种方法是为重载成员提供一个using声明语句,这样我们就无须覆盖每一个重载版本了。

1.2K20

C++关键知识点梳理

设计工具拷贝、赋值、销毁拷贝构造函数:将一个对象作为非引用实参、将一个非引用对象直接作为函数返回值、用花括号列表初始化一个数组或者一个成员时均使用了拷贝构造函数。...protected继承方式所有 public 成员在派生类为 protected 属性;所有 protected 成员在派生类为 protected 属性;所有 private...private继承方式所有 public 成员在派生类均为 private 属性;所有 protected 成员在派生类均为 private 属性;所有 private 成员在派生类不能使用...每个虚继承子类都有一个虚指针(占用一个指针存储空间,4字节)和虚表(不占用对象存储空间)当派生类重新定义虚函数时,则将派生类虚函数地址添加到虚函数表。...当一个指针指向一个派生类对象时,虚函数表指针指向派生类对象虚函数表。当调用虚函数时,由于派生类对象重写了派生类对应虚函数表项,在调用时会调用派生类虚函数,从而产生多态。

91630

硬核 | C++ 基础大全

所以不能在声明初始化 const 数据成员,因为对象在没有创建时候,编译器不知道 const 数据成员是什么。const 数据成员初始化只能在构造函数初始化列表中进行。...也就是说构造派生类部分是,编译器会认为这就是一个类型对象,然后调用类型虚函数实现,并没有按照我们想要方式进行。即对象派生类构造函数执行前并不会成为一个派生类对象。...因为一个指针指向一个派生类对象,在派生类对象针对虚函数参数缺省值进行了重定义, 但是缺省参数值是静态绑定,静态绑定绑定是静态类型相关内容,所以会出现一种派生类虚函数实现方式结合了缺省参数值调用效果...何时需要成员初始化列表?过程是什么?...在派生类构造函数,所有的虚及上一层构造函数调用; 对象 vptr 被初始化; 如果有成员初始化列表,将在构造函数体内扩展开来,这必须在 vptr 被设定之后才做; 执行程序员所提供代码;

1.1K10

C++多态原理揭秘

抽象不能被实例化,也就是不能创建对象但是可以定义指向抽象指针和引用,并通过派生类对象地址来初始化它们。 派生类必须实现其中所有的纯虚函数,否则它仍然是抽象,无法被实例化。...那vfptr是什么呢? Virtual Function Pointer即虚函数指针. 虚函数指针,顾名思义,就是用于指向虚函数指针. 对象这个指针我们叫做虚函数表指针。...派生类虚表 派生类虚表有两部分构成: 第一部分: 中继承下来虚函数(如果在派生类也定义了,就会重写,也就实现了多态). 第二部分: 派生类自己虚函数,放在虚函数表下半部分....内存窗口中看到第三个函数指针,我们猜测是派生类自己虚函数,下面再验证. 派生类虚表生成: 先将虚表内容拷贝一份到派生类虚表 ....(继承下来) 如果派生类重写了某个虚函数,用派生类自己虚函数覆盖虚表虚函数 (重写) 派生类自己新增加虚函数按其在派生类声明次序增加到派生类虚表最后。

12620

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

15.1 OOP:概述 面向对象程序设计(Oject-Oriented Programming)核心是数据抽象,继承和动态绑定。...,其余时候都不能转换 无论是什么继承,派生类和友元都可以在成员中使用派生到转换 public和protected继承时,派生类自己派生类和友元可以使用派生到转换,private则不行 总结起来...为了规范和可读性,最好不要利用默认控制符,显式说明比较清晰 15.6 继承作用域 名字查找是内到外查找,当派生类无法找到时,就会往直接查找,以此类推 名称查找是根据编译时目标的静态类型进行查找...因此通常我们定义派生类拷贝构造函数时也会在列表里调用拷贝构造函数。其他操作也有类似的设计 对象销毁顺序与构造顺序正好相反,派生类析构先执行然后是派生类构造先构造再构造派生。...,除了: 派生类通过定义相同参数列表只继承没有定义那部分,自定义其他部分 默认,拷贝和移动构造函数不会被继承,这些函数会被派生类默认合成 15.8 容器与继承 当我们想要把继承体系对象存放到容器

49820

C++:继承与派生

这里不可见是指私有成员还是被继承到了派生类对象,但是语法上限制派生类对象不管在里面还是外面都不能去访问它。...面使用,实际扩展维护性不强 二、派生类对象赋值转换 1、派生类对象 可以赋值给 对象 / 指针 / 引用。...; Person* pp = &sobj; Person& rp = sobj; //反之 对象不能赋值给派生类对象 sobj = pobj; } 3、指针或者引用可以通过强制类型转换赋值给派生类指针或者引用...派生类构造函数必须调用构造函数初始化那一部分成员。如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用。 2....另一方面,基于对象组合设计会有更多对象 (而有较少),且系统行为将依赖于对象关系而不是被定义在某个。   这导出了我们面向对象设计第二个原则:优先使用对象组合,而不是继承

9710

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

用做必须是已定义。 存在虚函数+指针或引用==产生多态。非虚函数编译时就按指针或引用或对象类型确定。可以使用域操作符强制调用虚函数【虚调虚】。虚函数和派生类默认实参要一致。...派生类继承访问控制标号【何种方式继承】无论是什么,不影响派生类使用成员,但影响使用派生类用户访问成员。使用接口继承还是实现继承对派生类用户具有重要含义。 友元关系不继承。...如果知道派生类转换【这种转换是地址赋给派生类指针】是安全【就是说心里清楚指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。...构造函数无法继承,派生类构造数还要初始化【否则只能用合成构造函数初始化】。初始化列表和初始化顺序无关。只能初始化直接。...纯虚函数==抽象==无法创建对象 派生类对象复制到派生类对象将被切掉【而指针和引用不会】。

1.4K20

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

三、构造函数初始化顺序 构造顺序与派生列表出现顺序有关,而与构造函数初始化列表初始化顺序无关 派生类构造自己之前同样需要构造对象。...:https://blog.csdn.net/qq_41453285/article/details/104435826 继承构造函数是使用using继承构造函数概念 在C++11标准,允许派生类一个或几个中继承构造函数...与单一继承原理一致,对象、引用、指针静态类型决定了我们能够使用哪些成员 例如: 我们使用一个ZooAnimal指针指向于一个派生类,那么只能通过这个指针访问属于ZooAnimal数据成员/方法,而不能调用属于数据成员...,在派生类不存在,那么就继续向中进行查找,如果查找到了就进行使用 多重继承下派生类作用域嵌套在所有的或间接作用域中 二义性与二义性解决 当同一个数据成员/函数名称在不同中出现时...::num, B::num); } }; 注意事项: 有时即使派生类继承两个函数形参列表不同也可能会发生错误 另外,同名数据成员/函数,在不同访问权限不同也可能会发生错误(例如一个数据成员在

89130

【C++】多态

虚函数重写(覆盖):派生类中有一个跟完全相同虚函数(即派生类虚函数与虚函数 返回值类型、函数名字、参数列表完全相同),称子类虚函数重写了虚函数。...即虚函数返回对象指 针或者引用,派生类虚函数返回派生类对象指针或者引用时,称为协变。...baseP实际指向对象类型到底是什么。...派生类对象d也有一个虚表指针,d对象由两部分构成,一部分是父继承下来成员,虚表指针也就是存在部分另一部分是自己成员。 2....总结一下派生类虚表生成:a.先将虚表内容拷贝一份到派生类虚表 b.如果派生 重写了某个虚函数,用派生类自己虚函数覆盖虚表虚函数 c.派生类自己 新增加虚函数按其在派生类声明次序增加到派生类虚表最后

11210

必知必会之C++多态机制

START Hi,大家!昨天技术群里在讨论一个C++多态问题,今天我们来聊一聊C++多态机制。...具体来说,多态性允许指针或引用在运行时指向派生类对象,并且根据对象实际类型来调用相应成员函数。 多态性是通过虚函数来实现。...派生类重写虚函数: 派生类可以通过重写(覆盖)虚函数来提供自己实现。在调用这个虚函数时,会根据对象实际类型来决定调用哪个版本函数。...在 main() 函数,我们创建了 Dog 和 Cat 对象,并将指针指向这些对象,然后通过指针调用虚函数 makeSound()。...具体来说,如果父指针或引用指向是子类对象,那么调用方法将是子类重写版本;如果指针或引用指向是父对象,那么调用方法将是父版本。

9710

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

这里不可见是指私有成员还是被继承到了派生类对象,但是语法上限制派生类对象不管在里面还是外面 都不能去访问它。...---- 二、派生类对象赋值转换 派生类对象 可以赋值给 对象 / 指针 / 引用。这里有个形象说法叫切片或者切割。寓意把派生类那部分切来赋值过去。...对象不能赋值给派生类对象指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须是指针是指向派生类对象时才是安全。...如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用。 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。...补充: 同样,我们看下面这段代码: 因为函数是存储在代码段,所以调用函数也是不需要解引用对象获取,这里对象作用也是传递一个this指针

33220
领券