浅谈C++ 基类指针和子类指针的相互赋值
首先,给出基类animal和子类fish //============================================================== // animal.h // // author : zwq // describe: 非虚函数情况下,将子类指针赋给积累指针,验证最终调用 // 基类函数还是子类函数。 //============================================================== #ifndef ANIMAL_H #define ANIMAL_H //=============================================================== // // animal // 动物基类 // //=============================================================== class animal { public: void breathe(); // 非虚函数 }; //=============================================================== // // animal // 鱼类,集成于动物基类 // //=============================================================== class fish : public animal { public: void breathe(); // 非虚函数 }; #endif #include "StdAfx.h" #include <iostream> #include "Animal.h" using namespace std; //=============================================================== // // animal // 动物基类 // //=============================================================== void animal::breathe() { cout << "animal breathe" << endl; } //=============================================================== // // animal // 鱼类,集成于动物基类 // //=============================================================== void fish::breathe() { cout << "fish bubble" << endl; } 一.基类指针和子类指针之间相互赋值 (1)将子类指针赋值给基类指针时,不需要进行强制类型转换,C++编译器将自动进行类型转换。因为子类对象也是一个基类对象。 (2)将基类指针赋值给子类指针时,需要进行强制类型转换,C++编译器将不自动进行类型转换。因为基类对象不是一个子类对象。子类对象的自增部分是基类不具有的。 执行以下代码,看看会报什么错误: 编译时,报如下错误信息: --------------------Configuration: CPlusPlusPrimer - Win32 Debug-------------------- CPlusPlusPrimer.exe - 1 error(s),0 warning(s) 根据以上错题提示信息,对代码做如下修改: void ExamAnimal() { // 将子类指针直接赋给基类指针,不需要强制转换,C++编译器自动进行类型转换 // 因为fish对象也是一个animal对象 animal* pAn; fish* pfh = new fish; pAn = pfh; delete pfh; pfh = NULL; // 将基类指针直接赋给子类指针,需要强制转换,C++编译器不会自动进行类型转换 // 因为animal对象不是一个fish对象 fish* fh1; animal* an1 = new animal; // 修改处: // 进行强制类型转化 fh1 = (fish*)an1; delete an1; an1 = NULL; } 再次编译,通过。 二.子类指针赋给基类指针时内存分析 (1)int变量赋给char变量 (2)子类fish指针赋给基类animal指针 (3)基类animal指针赋给子类fish指针 基类animal对象包含的信息少,类fish对象包含的信息多,将信息少的对象直接转换为信息多的对象时(没有强制类型转换),显然是无法构造出多出的信息。在编译时,也会发生如下错误:error C2440: '=' : cannot convert from 'class animal *' to 'class fish *'。 这时,需要做强制类型转换: // 将基类指针直接赋给子类指针,需要强制转换,C++编译器不会自动进行类型转换 // 因为animal对象不是一个fish对象 fish* fh1; animal* an1 = new animal; // 进行强制类型转化 fh1 = (fish*)an1; 以上就是小编为大家带来的浅谈C++ 基类指针和子类指针的相互赋值全部内容了,希望大家多多支持编程小技巧~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |