首先,给出基类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++编译器将不自动进行类型转换。因为基类对象不是一个子类对象。子类对象的自增部分是基类不具有的。
执行以下代码,看看会报什么错误:
int main(int argc, char* argv[])
{
ExamAnimal();
return 0;
}
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 = an1;
delete an1;
an1 = NULL;
}
编译时,报如下错误信息:
--------------------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++带有指针成员的类处理方式详解
# 子类
# 不需要
# 当我们
# 转换为
# 会报
# 类似于
# 在这里
# 也会
# 提示信息
# 只有一个
# 将不
# 错误信息
# 多出
# 小编
# 图中
# 放不下
# 大家多多
# 一定要看
# 象中
# 整型
相关文章:
深圳网站制作平台,深圳市做网站好的公司有哪些?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何快速上传建站程序避免常见错误?
高端企业智能建站程序:SEO优化与响应式模板定制开发
jQuery 常见小例汇总
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何用y主机助手快速搭建网站?
北京专业网站制作设计师招聘,北京白云观官方网站?
动图在线制作网站有哪些,滑动动图图集怎么做?
建站之星在线客服如何快速接入解答?
简单实现Android文件上传
网站制作企业,网站的banner和导航栏是指什么?
建站主机CVM配置优化、SEO策略与性能提升指南
专业商城网站制作公司有哪些,pi商城官网是哪个?
建站之星24小时客服电话如何获取?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
建站之星如何实现PC+手机+微信网站五合一建站?
网页设计与网站制作内容,怎样注册网站?
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何在万网自助建站中设置域名及备案?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何在阿里云购买域名并搭建网站?
如何获取PHP WAP自助建站系统源码?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何在宝塔面板中创建新站点?
5种Android数据存储方式汇总
如何配置WinSCP新建站点的密钥验证步骤?
大连网站设计制作招聘信息,大连投诉网站有哪些?
如何快速生成凡客建站的专业级图册?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
如何快速搭建高效WAP手机网站吸引移动用户?
香港服务器如何优化才能显著提升网站加载速度?
如何在企业微信快速生成手机电脑官网?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
大学网站设计制作软件有哪些,如何将网站制作成自己app?
创业网站制作流程,创业网站可靠吗?
c# 在高并发场景下,委托和接口调用的性能对比
如何通过多用户协作模板快速搭建高效企业网站?
实例解析angularjs的filter过滤器
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
招商网站制作流程,网站招商广告语?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何配置IIS站点权限与局域网访问?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
如何在IIS中新建站点并配置端口与IP地址?
西安大型网站制作公司,西安招聘网站最好的是哪个?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
*请认真填写需求信息,我们会在24小时内与您取得联系。