-
简单来说:向上转型就是将子类转化成父类
-
数据类型转换,编译器会直接将小数部分丢掉。比如:int a=6.6,输出%d的时候就是6
-
只能将派生类赋值给基类 : 派生类对象赋值给基类对象、将派生类指针赋值给基类指针、将派生类引用赋值给基类引用
-
派生类对象赋值给基类对象,舍弃派生类新增的成员
-
派生类指针赋值给基类指针,没有拷贝对象的成员,也没有修改对象本身的数据,仅仅是改变了指针的指向
-
派生类引用赋值给基类引用,和指针的一样。
-
第2-第6点总结来说就是:向上转型后通过基类的对象、指针、引用只能访问到从基类继承过去的成员(包括成员变量和成员函数),不能访问派生类新增的成员
向上转型例子
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Father
{
public:
// Father();
// ~Father();
string firstName,lastName;
void print()
{
cout<<"father's firstName is : "<<this->firstName<<endl;
cout<<"father's lastName is : "<<this->lastName<<endl;
}
private:
};
class Child:public Father
{
public:
// Child();
// ~Child();
// string lastName; 因为是public继承,所以子类可以访问一切父类中的变量,不用再次定义
void print()
{
cout<<"child's firstName is : "<<this->firstName<<endl;
cout<<"child's lastName is : "<<this->lastName<<endl;
}
private:
};
int main()
{
Father father;
father.firstName="Jack";
Child child;
child.firstName="bob";
child.lastName="Hansen";
father=child;
father.print();
// 输出:
// father's firstName is : bob
// father's lastName is : Hansen
child.print();
// 输出:
// child's firstName is : bob
// child's lastName is : Hansen
// system("pause"); // Clion带stdlib.h头文件还报错!?
return 0;
}
向上转型的安全性
-
static_cast 静态转型/向上转型。向上转型比较安全,可以由编译器自动完成,不会有数据的丢失。在编译期间转换,转换失败的话会抛出一个编译错误。因为在编译期间就完成了类型转换,所以能够更加及时地发现错误。
-
向下转型:可以使用强转,向下转型是不安全的,需要程序员自己处理,有可能会导致数据的丢失,原因是父类的指针或者引用的内存中可能不包含子类的成员的内存。
-
dynamic_cast:用在类的继承层次之间进行类型转换,允许向上转型(无条件的,不会进行任何检测,所以都能成功)和向下转型(向下转型的前提必须是安全的,要借助 RTTI 进行检测,所有只有一部分能成功)。