首先,给出基类animal和子类fish ios
一.基类指针和子类指针之间相互赋值
(1)将子类指针赋值给基类指针时,不须要进行强制类型转换,C++编译器将自动进行类型转换。由于子类对象也是一个基类对象。web
(2)将基类指针赋值给子类指针时,须要进行强制类型转换,C++编译器将不自动进行类型转换。由于基类对象不是一个子类对象。子类对象的自增部分是基类不具备的。
执行如下代码,看看会报什么错误:app
编译时,报以下错误信息:函数
--------------------Configuration: CPlusPlusPrimer - Win32 Debug-------------------- Compiling... CPlusPlusPrimer.cpp E:\Study\example\CPlusPlusPrimer\CPlusPlusPrimer.cpp(94) : error C2440: '=' : cannot convert from 'class animal *' to 'class fish *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast Error executing cl.exe.
CPlusPlusPrimer.exe - 1 error(s), 0 warning(s)
根据以上错题提示信息,对代码作以下修改:oop
再次编译,经过。
二.子类指针赋给基类指针时内存分析 (1)int变量赋给char变量ui
整型int转换为char类型时,只有一个字节的内容可以放进char类型,剩下的三个字节内容放不下,被截掉,丢失精度。 两个变量或者对象进行转换时,必定要看二者的内存模型是否互相匹配。
(2)子类fish指针赋给基类animal指针 下面看看子类fish指针赋给基类animal指针时,内存的变化: 当咱们构造fish类的对象时,首先要调用animal类的构造函数去构造animal类的构造函数,而后才调用fish类的构造函数完成自身部分的构造,从而拼接出一个完整的fish对象。当咱们将fish类对象转换为animal类对象时,该对象就被认为是原对象整个内存模型的上半部分,也就是图中animal对象的内存部分。当咱们利用类型转换后的对象指针去调用它的方法时,天然是调用它所在的内存中的方法。 在这里,animal类对象相似于char类型的对象,fish类对象相似于int类型的对象,将fish类对象赋给animal类对象时,会截取fish类对象自身的部分,剩下fish类对象中的animal部分。
(2)基类animal指针赋给子类fish指针 基类animal对象包含的信息少,类fish对象包含的信息多,将信息少的对象直接转换为信息多的对象时(没有强制类型转换),显然是没法构造出多出的信息。在编译时,也会发生以下错误:error C2440: '=' : cannot convert from 'class animal *' to 'class fish *'。 这时,须要作强制类型转换:this