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

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

继承的关系是「有」的关系: C 类中「有」成员变量 i,i 成员变量是 D 类的,则 C 和 D 是复合关系。 逻辑要求:D 对象是 C 对象的固有属性或组成部分。...空间讲,用指针可以节省空间,免于构造 B 对象,而是只在对象中开辟了一个指针,而不是开辟了一个对象 B 的大小。 效率讲,使用指针适合复用。...对象 B 不但 A 对象能访问,其他需要用它的对象也可以使用。 指针对象可以使用多态的特性,基类的指针可以指向派生链的任意一个派生类。...那么如何在派生类构造函数里初始化基类构造函数呢?...---- || 03 基类与派生类的指针强制转换 public 派生方式的情况下,派生类对象的指针可以直接赋值给基类指针: Base *ptrBase = & objDerived; ptrBase 指向的是一个

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

【c++】继承学习(一):继承机制与基类派生类转换

但是,通过 rp 只能直接访问 sobj 中由 Person 定义的成员,Student 特有的成员 _No)不可以通过 rp 直接访问,除非进行了适当的强制转换 例子: Person& rp =...无法访问,因为_No是Student特有的成员,即使它实际存在于sobj中 即使我们通过基类引用或指针操作对象,派生类对象的完整信息(所有成员变量和函数)仍然都在内存中,没有丢失。...在使用引用或指针时,这种情况并不会发生 基类对象不能赋值给派生类对象 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。...,以及如何在派生类中访问基类的被隐藏成员的概念。...如果在派生类中尝试访问一个被隐藏的基类成员,需要显式地使用类名限定符来指定基类的成员。在 Print 方法中使用 Person::_num 来访问基类 Person 中的 _num 成员

31610

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

从输出可以看出: 派生类对象的构造次序: 先调用基类对象成员的构造函数,接着是基类的构造函数,然后是派生类的对象成员的构造函数,最后是派生类自身的构造函数。...::xx 访问,b.b_ 访问存在歧义,实际static成员不属于任一对象。...派生类对象自动转换为基类对象(特有的成员消失) 当派生类以private/protected方式继承基类时 派生类对象指针(引用)转化为基类对象指针(引用)需用强制类型转化。...无法将基类对象看成是派生类对象     e1 = m1;    // 派生类对象可以转化为基类对象。将派生类对象看成基类对象     // 会产生对象切割(派生类特有成员消失)。...; // 基类对象无法强制转化为派生类对象     return 0; } 五、基类到派生类的转换 基类对象指针(引用)可用强制类型转换为派生类对象指针(引用), 而基类对象无法执行这类转换.

1.5K00

《C#图解教程》读书笔记之四:类和继承

二、基类那点事儿   (1)如何在派生类中访问基类成员使用base关键字,base.Field1;   (2)如何屏蔽基类中某个方法或成员?在派生类定义的成员定义前使用new关键字; ?   ...(3)如何使用基类的引用?这里可以借鉴里氏替换法则,创建指向派生类的基类对象。 ? 三、小字符有大学问:成员访问修饰符 ?   ...(1)public:所有的类,包括程序集内部的和外部的类均可无限制地访问;   (2)private:只能被他自己的类的成员所访问;   (3)protected:允许自己类的成员和继承自该类的派生类成员访问...;   (4)internal:对程序集内部的所有类可见;   (5)protected internal:对所有继承自该类的派生类成员以及所有程序集内部的类可见; ?...四、密封类与静态类   (1)密封类:无法被继承,需要使用sealed修饰符;   (2)静态类:       ①类的所有成员必须是静态的;       ②类可以有一个静态构造函数,但不能有实例构造函数

65940

C++:28 --- C++内存布局(

由于C++基于C,所以C++也“基本”兼容C。特别地,C++规范在“结构”使用了和C相同的,简单的内存布局原则:成员变量按其被声明的顺序排列,按具体实现所规定的对齐原则在内存地址对齐。...VC++在虚基类表中增加了一些额外的项,这些项保存了从派生类到其各层虚基类的偏移量。 3 强制转化 如果没有虚基类的问题,将一个指针强制转化为另一个类型的指针代价并不高昂。...转化为E类型指针E*时,必须在指针加一个非0的偏移常量dFE。C ++规范要求NULL指针在强制转化后依然为NULL ,因此在做强制转化需要的运算之前,VC++会检查指针是否为NULL。...一般说来,当从派生类中访问虚基类成员时,应该先强制转化派生类指针为虚基类指针,然后一直使用虚基类指针来访问虚基类成员变量。这样做,可以避免每次都要计算虚基类地址的开销。 见下例。...前者一直使用派生类指针pi,故每次访问c1都有计算虚基类地址的较大开销;后者先将pi转化为虚基类指针pc,故后续调用可以省去计算虚基类地址的开销。

1K20

【C++ 进阶】继承

; 2.如果想要在派生类访问基类中的成员变量,可以在基类中定义为 protected 成员; 3.基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式); 4.使用关键字...class时默认的继承方式是private; 使用struct时默认的继承方式是public; 三.派生类和基类之间的赋值转换  1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用...,这个过程又被形象的称为      切片/切割; 2.基类对象不能赋值给派生类对象; 3.基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。...但是必须是基类的指针是指向派生类对象时才是安全的; 四.隐藏(重定义) 1.子类和父类中,只要函数名相同就构成隐藏; 2.成员名相同也构成隐藏; 3.在子类成员函数中,可以使用 基类::基类成员...d.A::_a; //显式访问,解决了二义性问题,但无法解决数据冗余问题 return 0; } 虚拟继承:解决菱形继承问题 在菱形继承的腰部加上 virtual  关键字构成虚拟继承; 将上面代码

12510

【C++航海王:追寻罗杰的编程之路】继承你学会了么?

实际总结一下就会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式,public > protected > private)....在实际运用中一般使用都是public继承,几乎很少使用protected / private继承,也不提倡使用protected / private继承,因为protected / private继承下来的成员都只能在派生类的类里面使用...寓意把派生类中父类那部分切来赋值过去。 基类对象不能赋值给派生类对象。 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。...//sobj = pobj; // 3.基类的指针可以通过强制类型转换赋值给派生类的指针 pp = &sobj; Student * ps1 = (Student*)pp; // 这种情况转换时可以的...多继承可以认为是C++的缺陷之一,后来很多的语言都没有多继承,Java。 3. 继承和组合 public继承是一种is-a的关系,也就是说每个派生类对象都是一个基类对象。

11210

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

有些时候我们不希望派生类独有的部分被截断,则需要使用类指针来调用重载的函数或使用指针所指的成员。...来强制转换。...,这一项决定的是派生类对继承来的成员对外表现出的最高权限,也就是这一项并不会影响派生类内部的使用,但是一旦外部想调用派生类使用成员: 如果此时访问说明符为public,则成员对外表现基类的权限 如果此时为...例如通过在FOO的public中加入using BASE::pub;可以使得上面的第一个语句不会报错 派生类对基类的转换也与派生列表的访问说明符有关,本质与类型转换函数的权限有关 public继承时用户代码才能使用派生到基类的转换...派生类对其自身没有定义的重载版本实际是利用了using的声明点进行了访问 15.7 构造函数和拷贝控制 继承体系中的类也需要控制类的几个基本操作,即构造,拷贝,移动,析构。

51320

类继承

类和继承 面向对象编程的主要目的之一就是提供可以重复使用的代码,减少开发周期,提高开发效率。 继承可以完成的一些工作: 在已有类的基础添加功能。 给类添加新的数据成员。 可以修改类方法的行为。...编译器对非虚方法使用静态联编,对虚方法使用动态联编。 因此,动态联编是在虚函数的支持下实现的。 动态联编主要包含一下方面: 成员函数必须声明为虚函数,即前面加virtual。...将派生类引用或指针转换为基类引用或指针称为向上强制转换,该转换使得公有继承不需要进行显示类型转换。...且该转换是可以传递的,例如基类A,其派生类AP,AP的派生类APP,则A指针或引用可以指向或引用AP类对象和APP类对象。 相反的,我们将基类指针或引用转换为派生类指针或引用称为向下强制转换。...但该种转换只能使用显示类型转换,防止无意间指向派生类独有的方法或成员造成的异常情况的发生。

69420

202452 学习笔记:继承基本概念

自己的理解: 所谓继承,就是将两个不同的类实现单方面的复用,继承的类可以使用父类的成员变量和成员函数。...用继承的对类创建的对象可以调用父类的成员函数,但要注意,派生类继承了父类的成员函数和成员变量,不是拷贝了一份到派生类里,而是给了派生类去父类调用父类函数的权利。...在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用...寓意把派生类中父类那部分切来赋值过去。 基类对象不能赋值给派生类对象。 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类 的指针是指向派生类对象时才是安全的。...sobj = pobj; // 3.基类的指针可以通过强制类型转换赋值给派生类的指针 pp = &sobj Student* ps1 = (Student*)

10310

abstract virtaul override new 及多态

在抽象方法声明中使用 static 或 virtual 修饰符是错误的。 除了在声明和调用语法不同外,抽象属性的行为与抽象方法一样。 在静态属性使用 abstract 修饰符是错误的。...在静态属性使用 virtual 修饰符是错误的。 通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。...从派生类访问基类虚拟成员 已替换或重写某个方法或属性的派生类仍然可以使用基关键字访问基类的该方法或属性。 ...在前面的示例中,类 F 的 DoWork 无法调用类 D 的 DoWork。在此情况下,抽象类可以强制派生类为虚方法提供新的方法实现。 ...由于密封类从不用作基类,所以有些运行时优化可以使对密封类成员的调用略快。 在对基类的虚成员进行重写的派生类的类成员、方法、字段、属性或事件可以将该成员声明为密封成员

75930

EasyC++84,私有继承(二)

访问基类方法 我们知道,在私有继承时,基类的公有对象以及保护对象会变成派生类的私有对象。我们可以在派生类方法当中使用它,但无法通过派生类对象直接调用,但无法访问基类的私有方法和对象。...这个概念我们很好理解,但具体到实现,我们如何在派生类的方法当中调用基类的公有或者保护方法呢? 比如,在之前的类声明当中我们声明了一个Average方法,用来计算学生考试成绩的平均分。...答案是使用强制转换。...引用不会自动发生转换,是因为在私有继承当中,在不进行显式类型转换的情况下,不能将派生类的引用或指针赋给基类的引用或指针。 那么问题来了,如果我们使用的是公有继承,那么是不是就可以了呢?...因此还是需要我们手动进行强制类型转换。

37910

C++进阶-继承

实际运用中一般使用public继承,很少使用protetced/private继承(不提倡:protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强 )...二、基类和派生类对象赋值转换 概念: 派生类对象可以赋值给基类的对象/基类的指针/基类的引用,也叫切片或者切割,即把派生类中父类那部分切来赋值过去 基类对象不能赋值给派生类对象基类的指针,但可以通过强制类型转换赋值给派生类的指针...//sobj = pobj;err // 3.基类的指针可以通过强制类型转换赋值给派生类的指针 pp = &sobj; Student * ps1 = (Student*)pp; // 这种情况转换时可以的...子类和父类中有同名成员子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义(在子类成员函数中,可以使用 基类::基类成员 显示访问) 注:在同一作用域函数名相同参数不同,为函数重载...对于多继承,菱形继承和菱形虚拟继承,底层实现很复杂,所以一般不建议设计出多继承,一定不要设计出菱形继承,否则在复杂度及性能上都有问题 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承(java

44950

C++primer学习笔记(六)

可以使用域操作符强制调用基类虚函数【虚中调虚】。基类虚函数和派生类的默认实参要一致。...派生类继承基类的访问控制标号【何种方式继承】无论是什么,不影响派生类使用基类成员,但影响使用派生类的用户访问基类成员。类使用接口继承还是实现继承对派生类用户具有重要含义。 友元关系不继承。...如果知道基类到派生类的转换【这种转换是基类地址赋给派生类指针】是安全的【就是说心里清楚基类指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。...派生类析构函数不负责清除基类成员,每个析构函数只负责清除自己成员。...引用、对象、指针的静态类型决定了能够完成的行为,动态类型有多的功能也无法使用派生类应避免与基类成员名字冲突。局部作用域中声明的函数不会重载全局域的函数。

1.1K20

类中承上启下的角色——继承

---- 前言 承:在面向对象编程时,我们通常将我们的需求实例化相关的类对象,在碰到需要处理大量相同的对象或相似的操作时,我们引入了类、函数和模板等标准化的功能,虽然我们可以通过模板等手段来提高上述功能编写时的泛型...在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用...3、基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。...sobj = pobj; // 3.基类的指针可以通过强制类型转换赋值给派生类的指针 pp = &sobj Student* ps1 = (Student*)pp; // 这种情况转换时可以的。...多继承带来的菱形继承可以认为是C++的缺陷之一,很多后来的很多语言都没有多继承,Java。 3. 继承和组合 public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。

74130

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

规则如下: 如果基类中的默认构造函数、拷贝构造函数、拷贝赋值运算符、或析构函数是被删除的或者是不可访问的,则派生类中对应的成员将是删除的,原因是编译器不能使用基类成员来执行派生类对象中属于基类的部分操作...当我们使用=default请求一个移动操作时,如果基类中的对应操作是删除的或不可访问的,那么派生类中该函数是被删除的,原因是派生类对象的基类部分不可移动。...派生类在执行拷贝构造函数/移动拷贝构造函数,或拷贝赋值运算符/移动赋值运算符时,不仅需要拷贝自己的成员,而需要拷贝基类的成员 拷贝构造函数/移动构造函数 当派生类定义拷贝或移动构造函数时,不仅需要构造自己的成员...,还需要构造属于基类的成员 这与构造函数不同: 如果基类有构造函数,派生类必须在构造函数的初始化列表构造继承(这是强制的) 而拷贝构造函数/移动构造函数不是强制的,因此如果你没有拷贝/移动属于基类的部分...,则应该执行与构造函数或析构函数所属类型相同的虚函数版本(同属于一个类) 六、继承/重用基类构造函数 C++11标准中,派生类能够“继承/重用”其直接基类定义的构造函数 使用规则: 使用using声明(

1.3K30

C++之继承

在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡 使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里...面使用,实际中扩展维护性 二、基类和派生类对象赋值转换 1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。...寓意把派生类中父类那部分切来赋值过去。 2.基类对象不能赋值给派生类对象。 3.基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。...//sobj = pobj; // 3.基类的指针可以通过强制类型转换赋值给派生类的指针 pp = &sobj; Student * ps1 = (Student*)pp; // 这种情况转换时可以的...(在子类成员函数中,可以使用 基类::基类成员 显示访问) 3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 4. 注意在实际中在继承体系里面最好不要定义同名的成员

9810
领券