ITPub博客

首页 > > > C++向上转型问题

C++向上转型问题

作者:youou 时间:2019-12-04 10:52:49 0 删除 编辑

编程老大叔 



在程序开发中,数据类型转换是再正常不过的事情了,特别是C++这种强类型语言。例如我们常用的整型和浮点型数据的转换;

float a = 1.23 ;

int b = a ;

cout<<b ;

输出的将会是1,小数部分会被舍弃;

int a = 1;

float b = a ;

cout<<b ;

输出结果将是1.000000,会自动加上小树部分

类,其实也与int、float一样是一种数据类型,那么类也就自然存在类型转换了,今天就来讲一讲C++的向上转型:

所谓向上转型就是将子类转换为父类。请看下面代码:

class Father

{

public:

Father();

~Father();

string firstName ;

void showName()

{

cout<<"father's name is:"<<this->firstName<<endl ;

}

private:

};

class Child:public Father

{

public:

Child();

~Child();

string lastName ;

void showName()

{

cout<<"child's name is:"<<this->firstName<<" "<<this->lastName<<endl ;

}

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 指针。

图示原理如下:

向上转型原理示意图

向上转型非常安全,可以由编译器自动完成,但是向下转型非常危险,需要程序员自己处理,有可能会导致数据的丢失,原因是父类的指针或者引用的内存中可能不包含子类的成员的内存。

关于向下转型的处理,后续我会从原理上详细的分享出来。今天工作太忙了,就先分享这个最基础的但是又十分重要的内容。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4729/viewspace-3149989/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-07-17

  • 博文量
    294
  • 访问量
    13386