首先,给出基类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--------------------
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)
根据以上错题提示信息,对代码做如下修改:
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变量
整型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部分。
(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++ 基类指针和子类指针的相互赋值全部内容了,希望大家多多支持~
# 基类指针和子类指针赋值
# C++获取类的成员函数的函数指针详解及实例代码
# C/C++静态类和this指针详解及实例代码
# C++ 基类指针和子类指针相互赋值的实现方法
# 实例解析C++中类的成员函数指针
# C++中指针的数据类型和运算相关知识小结
# C++指向类成员函数的指针详细解析
# C++带有指针成员的类处理方式详解
# 子类
# 当我们
# 转换为
# 不需要
# 会报
# 类似于
# 在这里
# 也会
# 提示信息
# 只有一个
# 将不
# 浅谈
# 错误信息
# 多出
# 小编
# 图中
# 放不下
# 大家多多
# 一定要看
# 象中
相关文章:
如何通过主机屋免费建站教程十分钟搭建网站?
建站主机选购指南与交易推荐:核心配置解析
视频网站app制作软件,有什么好的视频聊天网站或者软件?
如何选择高效稳定的ISP建站解决方案?
成都网站制作报价公司,成都工业用气开户费用?
常州企业建站如何选择最佳模板?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
seo网站制作优化,网站SEO优化步骤有哪些?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
深入理解Android中的xmlns:tools属性
定制建站方案优化指南:企业官网开发与建站费用解析
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
如何解决ASP生成WAP建站中文乱码问题?
潮流网站制作头像软件下载,适合母子的网名有哪些?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
php json中文编码为null的解决办法
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
开心动漫网站制作软件下载,十分开心动画为何停播?
5种Android数据存储方式汇总
建站VPS推荐:2025年高性能服务器配置指南
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
如何在IIS中配置站点IP、端口及主机头?
微信推文制作网站有哪些,怎么做微信推文,急?
如何通过可视化优化提升建站效果?
网站网页制作专业公司,怎样制作自己的网页?
如何通过FTP空间快速搭建安全高效网站?
如何快速搭建支持数据库操作的智能建站平台?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何快速搭建个人网站并优化SEO?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何自定义建站之星网站的导航菜单样式?
建站之星在线客服如何快速接入解答?
建站之星安装失败:服务器环境不兼容?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
建站主机无法访问?如何排查域名与服务器问题
建站之星后台管理:高效配置与模板优化提升用户体验
html制作网站的步骤有哪些,iapp如何添加网页?
高端企业智能建站程序:SEO优化与响应式模板定制开发
大同网页,大同瑞慈医院官网?
如何获取上海专业网站定制建站电话?
如何在橙子建站中快速调整背景颜色?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
网站制作公司排行榜,四大门户网站排名?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
*请认真填写需求信息,我们会在24小时内与您取得联系。