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

C++:43---派生类转换、静态动态变量

二、转换本质 派生类可以转换为本质: ①为什么派生类可以转换为派生类而来,因此派生类中包含了方法和成员。...此时可以通过指针或引用指向派生类(相当于将派生类中继承那部分方法和成员绑定到上了,相当于派生类被截断了),然后就可以将派生类假装一个对象来使用(调用其中成员/方法) ②为什么不能转换为派生类...如果将一个对象绑定到派生类指针/引用上,此时派生类通过指针/引用访问自己新定义成员/方法时,发现找不到(因此不能将转换为派生类) 例如:下面B继承于A,子类继承于父,同时为父成员开辟了空间...三、继承方式对类型转换影响 遵循下面3个规则: 假设B继承于A ①只有当B公有地继承A时,用户代码才能使用派生类转换;如果B受保护/私有的继承于A,则不能使用派生类转换 因为保护或者私有继承...,因为其只能与自己类型一致对象绑定到一起 演示案例 当我们使用引用(或指针)时,我们并不清楚该引用(或指针)所绑定对象真实类型,该对象可能对象,也可能派生类对象。

1.6K10

《Effective C++》读书笔记(2):构造析构赋值运算

class SomeClass: private Uncopyable{ ... }; ---- 条款7、为多态声明virtual析构函数 C++中多态性质体现于虚函数:指针或引用调用虚函数时会检查指向对象是还是派生类...当这样一个指向派生类指针析构时,如果析构函数不是虚函数,则直接调用析构函数,那么派生类获取资源未释放,则会造成内存泄漏。...而当析构函数虚函数时则先调用对应派生类析构函数,再调用析构函数,资源全部释放。...对于派生类构造函数而言,进入其中时部分已构造完而派生类部分未构造完,对象类型,故而此时调用虚函数,实际上使用虚函数。 析构函数同理。...进入析构函数后派生类部分呈未定义值,对象类型,调用虚函数。 总而言之,在构造函数与析构函数中虚函数行为有特殊变化;为了避免出错,不要在其过程中使用虚函数。

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

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

---- 二、派生类对象赋值转换 派生类对象 可以赋值给 对象 / 指针 / 引用。这里有个形象说法叫切片或者切割。寓意把派生类中父那部分切来赋值过去。...对象不能赋值给派生类对象。 指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须指针指向派生类对象时才是安全。...派生类operator=必须要调用operator=完成复制。 派生类析构函数会在被调用完成后自动调用析构函数清理成员。...继承允许你根据实现来定义派生类实现。这种通过生成派生类复用通常被称为白箱复用(white-box reuse)。术语“白箱”相对可视性而言:在继承方式中,内部细节对子类可见 。...继承一定程度破坏了封装,改变,对派生类有很大影响。派生类依赖关系很强,耦合度高。 对象组合继承之外另一种复用选择。新更复杂功能可以通过组装或组合对象来获得。

33820

C++:53---菱形继承、虚继承

缺点解决: 数据冗余:通过下面“虚继承”技术来解决(见下) 访问不明确(二义性):通过作用域访问符::来明确调用。...:为了保证公共继承对象在创建时只保存一分实例 虚继承解决了菱形继承两个问题: 数据冗余:顶级在整个体系中只保存了一份实例 访问不明确(二义性):可以不通过作用域访问符::来调用(原理就是因为顶级在整个体系中只保存了一份实例...) 共享对象成为“虚” 说明:虚继承不会影响派生类本身,只是对虚进行说明 通过在继承列表中使用virtual关键字来说明,virtual与继承说明符(public、protected、private...)位置可以互换 演示案例 下面的ZooAnimal一个虚,Bear和Raccoon分别虚继承于ZooAnimal ?...{}; 三、虚继承中类型转换 虚继承中也可以将派生类抓换为,用指针/引用指向于派生类 菱形继承中类型转换 菱形继承中会发生错误,不能将派生类转换为 原理差不多,就是因为派生类中拥有多份实体

72830

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

析构时候,先是派生类先析构,然后析构。 书中补充①:需要注意编译器产生析构函数并非虚函数。...书中补充②编译器拒绝为生出operator=情况: 第一种情况:成员变量中,存在引用声明 第二种情况:存在const修饰成员变量。...p = s;//error,报错显示operator已删除函数 return 0; } 赋值不成功理由很简单,引用指向不可以被改变,赋值的话就说明要改变引用指向对象。...这种现象根本原因在于:在派生类对象调用构造函数期间,由于是先构造,那么在此期间,此时对象被视为对象,并且派生类成分并没有初始化,因此C++做法视它们不存在,这样才能保证安全。...,通过调用了createdogs函数,创建了Dog匿名对象,也就是调用了构造函数,然后进入了count_Dog函数,最后再次去调用派生类构造函数主体!

34110

C++中继承

s; //赋值给指针 Person* ptrp = &s; 注:指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。...但是必须指针指向派生类对象时才是安全。这里如果多态类型,可以使用RTTI(RunTime Type Information)dynamic_cast 来进行识别后进行安全转换。...并且注意到_num用法通过::成员 显示访问。..._num) {} ⭐3.派生类operator=必须要调用operator=完成复制 同样成员会去调用赋值函数,如果派生类自己那就需要调用自己赋值函数。...因为派生类都有operator=(),因此在调用operator=()时候,需要指定域,传入派生类对象进行切片处理即可!

94530

C++ Primer Plus习题及答案-第十三章

但只有通过显示类型转换,才可以将对象地址赋给派生类指针(向下转换),而使用这样指针不一定安全。 9. 可以将派生类对象赋给对象吗?可以将对象赋给派生类对象吗?...仅当派生类定义了转换运算符(即包含将引用作为唯一参数构造函数)或使用为参数赋值运算符时,相反赋值才是可能。 10. 假设定义了一个函数,它将对象引用作为参数。...为什么该函数也可以将派生类对象作为参数? 应为c++允许引用指向从该派生而来任何类型。 11. 假设定义了一个函数,它将对象作为参数(即函数按值传递对象)。...按值传递对象将调用复制构造函数,由于形参对象,因此将调用复制构造函数,复制构造函数已基引用为参数,该引用可以将指向作为参数传递派生对象,最终结构,将生成一个新对象,其成员对应于派生类对象部分...按值传递对象主要有点在于可以保护原始数据,但可以通过引用作为const类型传递,来达到同样目的。 13. 假设Corporation,PublicCorporation派生类

72590

领悟面向对象就离开发应用不远了(提高)有你对面向对象所有疑问,爆肝1w字

而必须通过方法进行访问,具体说就是派生类构造函数必须使用构造函数,其他类比 RatedPlayer :: RatedPlayer(unsigned int r,const &fn,const...注意:如果在派生类中重新定义方法,通常将方法声明为虚,好处程序将根据对象类型而不是引用或者指针类型来选择方法版本,算是一个惯例吧 函数实现我就不写了,不然篇幅太长了,感谢!...虚函数 虚函数源于c++中继承,多态一种。在c++中,一个指针或者引用可以指向或者引用派生类对象。同时,派生类可以重写成员函数。...中 可以在中将被重写成员函数设置为虚函数,其含义:当通过指针或者引用调用该成员函数时,将根据指针指向对象类型确定调用函数,而非指针类型。...值得注意 只能通过指向指针或对象引用来调用虚函数,其格式为:指向指针变量名->虚函数名(实参表)或对象引用名.虚函数名(实参表) 实现动态联编需要同时满足以下三个条件:

50820

每日一问06 构造函数可以是虚函数吗

有构造函数特点决定 虚函数使用条件必须通过指针或者引用调用 构造函数无法通过指针直接调用。只能通过 placement new方式调用。...我误区 根本说不清楚:直接回答vptr构造 不相关, 不懂 构造函数无法通过指针访问原理,new 如何调用构造函数申请用法。...根本说不清楚:必须创建好了,才能用,不懂 抽象和具体关系.接口不属于具体一个 析构函数可以是虚函数吗,为什么 参考思路: 可以是 析构函数 执行顺序 派生类 如果析构函数不被声明成虚函数,则编译器实施静态绑定...,在删除指向派生类指针时,只会调用析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。...如果声明了,触发 派生类 正确析构顺序。

68730

C++:继承与派生

使用,实际中扩展维护性不强 二、派生类对象赋值转换 1、派生类对象 可以赋值给 对象 / 指针 / 引用。...; Person* pp = &sobj; Person& rp = sobj; //反之 对象不能赋值给派生类对象 sobj = pobj; } 3、指针或者引用可以通过强制类型转换赋值给派生类指针或者引用...但是必须指针指向派生类对象时才是安全。这里如果多态类型,可以使用RTTI(RunTime Type Information)dynamic_cast 来进行识别后进行安全转换。...派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。 3. 派生类operator=必须要调用operator=完成复制。...②:当前对象与包含对象是一个低耦合关系,如果修改包含对象中代码不需要修改当前对象代码。 ③:对象组合通过获得对其他对象引用而在运行时刻动态定义

10710

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

= 子类,会对子类进行切片,把父部分给进行赋值。 也可以使用引用和指针,同样也是通过切片来进行赋值。都可以对派生类进行修改。 引用 引用就是创建一个子类中部分别名。...指针 指针就是将子类中地址赋值给指针。 注意: 派生类对象 可以赋值给 对象 / 指针 / 引用。这里有个形象说法叫切片或者切割。...寓意把派生类中父那部分切来赋值过去。 对象不能赋值给派生类对象。 指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须指针指向派生类对象时才是安全。...派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。 派生类operator=必须要调用operator=完成复制。..._d = 5; return 0; } 来看调试过程: 通过这个逐语句调试内存变化,我们可以确定大致内存情况: 不使用虚拟继承就是这样内存情况,也好理解为什么同名变量两份如何储存

5610

C++之继承

使用,实际中扩展维护性 二、派生类对象赋值转换 1.派生类对象 可以赋值给 对象 / 指针 / 引用。...这里有个形象说法叫切片或者切割。寓意把派生类中父那部分切来赋值过去。 2.对象不能赋值给派生类对象。 3.指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。...但是必须指针指向派生类对象时才是安全。...派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。 3. 派生类operator=必须要调用operator=完成复制。 4....这里通过了B和C两个指针,指向一张表。这两个指针叫虚表指针,这两个表叫虚表。虚表中存偏移量。通过偏移量可以找到下面的A。

9510

【C++修炼之路】15.C++继承

因为可以切割,却不能补充,因此这样在引用/指针时候不对。 当然,也不绝对,有几个例子可以将对象赋值给派生类对象,但这里知道即可,后续会补充上。 3....指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须指针指向派生类对象时才是安全。...派生类operator=必须要调用operator=完成复制。 派生类析构函数会在被调用完成后自动调用析构函数清理成员。...即B中地址指向大小为20,C中地址指向大小为12,通过左侧内存已两段地址相减,正好一一对应,而这两个数字就是举例虚对象偏移量。为什么会有偏移量?...继承一定程度破坏了封装,改变,对派生类有很大影响。派生类依赖关系很强,耦合度高。 对象组合继承之外另一种复用选择。新更复杂功能可以通过组装或组合对象来获得。

52200

学过 C++ 你,不得不知这 10 条细节!

那么可能在读取未初始化值会导致不明确行为。 为了避免不确定问题,最佳处理方法就是:永远在使用对象之前将它初始化。...最后还有一个情况:如果某个operator= 函数声明为 private ,编译器将拒绝为其派生类生成 operator= 函数。...多态性质需声明 virtual 析构函数 如果在多态性质,没有声明一个 virtual 析构函数,那么在 delete 指针对象时候,只会调用析构函数,而不会调用派生类析构函数,...问题出在 pa 指针指向派生类对象,而那个对象却经由一个指针被删除,而目前没有 virtual 析构函数。...说明,构造期间 virtual 函数绝不会下降到派生类阶层。取而代之,对象作为就像隶属于类型一样。

70720

深度剖析C++继承

2.2继承关系和访问限定符 继承关系符指的是在派生类名加冒号后面的字符 访问限定符指的是对成员声明 用一张图说明: 需要特别注意: (1)private成员还是继承到派生类中,但是无论什么方式都访问不了...(2)class默认继承方式private,struct默认继承方式public 二.派生类对象赋值转换 派生类对象可以赋值给对象/引用/指针,这样操作有个形象说法叫切片或者切割...对象不能赋值给派生类对象。 指针或引用可以通过强制类型转换赋值给派生类指针或引用,但是只有在指针指向派生类时候才是安全。但是建议尽量不要这样操作。...将派生类,发生了类型转换,但是并没有产生临时变量(特殊处理) 三.继承中作用域 3.1概念 在继承体系中派生类都有自己独立作用域 当派生类中存在同名成员,则派生类成员会对同名成员直接访问进行屏蔽...派生类拷贝构造函数必须调用拷贝构造函数实现构造。 派生类赋值重载operator=必须调用赋值重载实现复制。

7810

【C++】继承

2.2 派生类对象赋值给对象引用 那除此之外呢,还可以这样搞: 还可以赋给Person对象引用,即子类对象可以赋值给对象引用。...那对它解引用就相当于拿到一个父对象,这个父对象可以认为从子类对象中切出来属于父那一部分。 2.4 对象不能赋值给派生类对象 我们刚才是把派生类对象赋值给,那反过来可以吗?...可以赋值给派生类吗? 不行对象不能赋值给派生类对象。...我们发现这里我们自己初始化继承下来_name成员但是报错了。 为什么不行呢?那这里要告诉大家派生类构造函数必须调用构造函数初始化那一部分成员。...4.3 赋值重载 那赋值重载呢其实也是一样,我们这里就不再那么仔细分析了 派生类operator=必须要调用operator=完成部分赋值。

10210

C++-带你初步走进继承(1)

2.派生类对象赋值转换 派生类对象 可以赋值给 对象 / 指针 / 引用 。这里有个形象说法叫切片 或者切割。...我在Person和Student都写了一个fun函数,这两个fun函数只有参数不同,那么构成重载吗?不是,这两个函数构成隐藏 ,为什么呢?...因为两个作用域独立,而构成重载前提同一作用域。 如果出现派生类定义了同名成员,可以使用使用 ::成员 显示访问。...派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。 3. 派生类 operator= 必须要调用 operator= 完成复制。 4....因为先析构的话,万一派生类使用成员,而且已经被析构,有可能出现资源已经清理释放掉了,然后派生类还去访问了成员,就会存在野指针问题。

11310

60秒问答:多态和函数重载关系?

隐藏:不用作用域, 通过派生类访问:派生类同名函数,隐藏函数 或者通过指针访问,函数隐藏派生类。 二、 问题:如何解隐藏问题?...为了让隐藏起来名字重见天日,使用using声明 通过base指针或者引用访问 (这个和虚函数无关) 情况2 如果通过通过base指针或者引用访问 隐藏派生类同名函数。...三、如何将隐藏行为覆盖掉 情况1 如果通过派生类访问一个函数,派生类局部作用域隐藏上层 base函数 为了让隐藏起来名字重见天日,使用using声明 通过base指针或者引用访问 (这个和虚函数无关...) 情况2 如果通过通过base指针或者引用访问 隐藏派生类同名函数。...为了让隐藏起来名字重见天日,使用using声明 通过base指针或者引用访问 (这个和虚函数无关) 情况2 如果通过通过base指针或者引用访问 隐藏派生类同名函数。

1.3K10

C++:46---绝不重新定义继承而来non-virtual函数

静态类型变量:在编译时就已经知道是什么类型了 动态类型变量:自己所指类型不明确,直到运行时才知道 如果表达式既不是引用也不是指针,那么其就没有静态类型和动态类型概念,因为其只能与自己类型一致对象绑定到一起...演示案例 当我们使用引用(或指针)时,我们并不清楚该引用(或指针)所绑定对象真实类型,该对象可能对象,也可能派生类对象。...A,且指针也为A,因此调用AgetA()函数 A 20:虽然p2指针指向类型为B,但是访问规则只与指针/引用类型有关,而与指针/引用指向类型无关。...main() { D x; B *pB = &x; pB->mf(); //调用D::mf() D *pD = &x; pD->mf(); //调用D::mf() return 0; } 三、为什么不建议派生类隐藏...如果: 我们在派生类中隐藏了non-virtual函数,那么派生类就会产生行为上不一致,is-a关系就消失了 如果想要表现出派生类不同,那么应该将函数声明为virtual(其中虚析构函数一个例子

45420

【C++】继承(定义、菱形继承、虚拟继承)

派生类对象可以赋值给 对象 / 指针 / 引用。这里有个形象说法叫切片 或者切割。寓意把派生类中父那部分切来赋值过去。 对象不能赋值给派生类对象。...指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须 指针指向派生类对象时才是安全。 切片有赋值兼容,在赋值时候不会产生临时对象,就不需要加const。...派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。 派生类operator=必须要调用operator=完成复制。...优先使用对象组合,而不是继承。 继承允许你根据实现来定义派生类实现。这种通过生成派生类复用通常被称为白箱复用。术语“白箱”相对可视性而言:在继承方式中, 内部细节对子类可见 。...继承一定程度破坏了封装,改变,对派生类有很大影响。派生类依赖关系很强,耦合度高。 对象组合继承之外另一种复用选择。新更复杂功能可以通过组装或组合对象来获得。

700
领券