1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
//==============================================================
// 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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#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)
根据以上错题提示信息,对代码做如下修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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类型,剩下的三个字节内容放不下,被截掉,丢失精度。 两个变量或者对象进行转换时,一定要看两者的内存模型是否互相匹配。
下面看看子类fish指针赋给基类animal指针时,内存的变化: 当我们构造fish类的对象时,首先要调用animal类的构造函数去构造animal类的构造函数,然后才调用fish类的构造函数完成自身部分的构造,从而拼接出一个完整的fish对象。当我们将fish类对象转换为animal类对象时,该对象就被认为是原对象整个内存模型的上半部分,也就是图中animal对象的内存部分。当我们利用类型转换后的对象指针去调用它的方法时,自然是调用它所在的内存中的方法。 在这里,animal类对象类似于char类型的对象,fish类对象类似于int类型的对象,将fish类对象赋给animal类对象时,会截取fish类对象自身的部分,剩下fish类对象中的animal部分。
基类animal对象包含的信息少,类fish对象包含的信息多,将信息少的对象直接转换为信息多的对象时(没有强制类型转换),显然是无法构造出多出的信息。在编译时,也会发生如下错误:error C2440: '=' : cannot convert from 'class animal *' to 'class fish *'。 这时,需要做强制类型转换:
1
2
3
4
5
6
|
// 将基类指针直接赋给子类指针,需要强制转换,C++编译器不会自动进行类型转换
// 因为animal对象不是一个fish对象
fish* fh1;
animal* an1 = new animal;
// 进行强制类型转化
fh1 = (fish*)an1;
|
以上就是小编为大家带来的浅谈C++ 基类指针和子类指针的相互赋值全部内容了,希望大家多多支持快网idc~
相关文章
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-25 64
-
2025-05-29 98
-
2025-05-29 83
-
2025-05-26 61
-
2025-05-29 42