在程序开发中,数据类型转换是再正常不过的事情了,特别是C++这种强类型语言。例如我们常用的整型和浮点型数据的转换;
float a = 1.23 ;
int b = a ;
cout<
输出的将会是1,小数部分会被舍弃;
int a = 1;
float b = a ;
cout<
输出结果将是1.000000,会自动加上小树部分
类,其实也与int、float一样是一种数据类型,那么类也就自然存在类型转换了,今天就来讲一讲C++的向上转型:
所谓向上转型就是将子类转换为父类。请看下面代码:
class Father
{
public:
Father();
~Father();
string firstName ;
void showName()
{
cout<firstName<
}
private:
};
class Child:public Father
{
public:
Child();
~Child();
string lastName ;
void showName()
{
cout<firstName<lastName<
}
private:
};
void main()
{
Father father ;
father.firstName = "mickal";
Child child ;
child.firstName = "nike";
child.lastName = "jordan" ;
father = child ;
father.showName();
system("pause");
}
最后打印出来的结果是:father's name: nike;
向上转型有以下两点要注意:
1、子类除继承父类数据成员,并且还会有自己的数据成员,但是在向上转型后子类的数据成员会被舍弃
2、赋值的本质是将现有的数据写入已分配好的内存中,对象的内存只包含了成员变量,所以对象之间的赋值是成员变量的赋值,成员函数不存在赋值问题。这点从运行结果就能看出来,虽然有father = child赋值过程,但是father.showName()始终调用的都是 Father 类的 showName() 函数。换句话说,对象之间的赋值不会影响成员函数,也不会影响 this 指针。
图示原理如下:
向上转型非常安全,可以由编译器自动完成,但是向下转型非常危险,需要程序员自己处理,有可能会导致数据的丢失,原因是父类的指针或者引用的内存中可能不包含子类的成员的内存。
关于向下转型的处理,后续我会从原理上详细的分享出来。今天工作太忙了,就先分享这个最基础的但是又十分重要的内容。