派生类到基类的转换
(1)当派生类以public方式继承基类时,编译器可自动执行的转换(向上转型upcasiting 安全转换)
1、派生类对象指针自动转换为基类对象指针
2、派生类对象引用自动转化为基类对象引用
3、派生类对象自动转换为基类对象(特有的成员消失)
(2) 当派生类以private/protected 方式继承基类时
1、派生类对象指针(引用)转换为基类对象指针(引用)需用强制类型转化。但不能用static_cast,要用reinterpret cast
2、不能把派生类对象强制转换为基类对象。
基类到派生类的转换(无private/public约束)
(1)基类对象指针(引用)可以强制类型转换为派生类对象指针(引用),而基类对象无法执行这类转换
(2)向下转型是不安全的,没有自动转换机制
以下是具体demo
#include <iostream>
#include <string>
using namespace std;class Employee
{
public:
Employee(const string& name,const int age,const int deptno):name_(name),age_(age),deptno_(deptno){}
protected:
private:
string name_;
int age_;
int deptno_;
};
class Manager:public Employee
{
public:
Manager(const string& name,const int age,const int deptno,int level):Employee(name,age,deptno),level_(level){}
protected:
private:
int level_;
};class Manager2:private Employee//private 私有继承
{
public:
Manager2(const string& name,const int age,const int deptno,int level):Employee(name,age,deptno),level_(level){} protected:
private:
int level_;
};
int main(){
Employee e1("zhangsan",24,11);
Manager m1("lisi",35,12,1);
Manager2 m2("wangwu",35,12,1);
Employee* pe;
Manager* pm;
Manager2* pm2(&m2);
pe=&e1;
pm=&m1;
pe=&m1;//ok,public继承的时候,派生类对象指针可以转换为基类对象指针。将派生类对象看成基类对象 //pm=&e1;//error,基类对象指针无法转换为派生类对象指针。无法将基类对象看成是派生类对象
e1=m1;//public继承的时候,派生类可以转换成基类对象,会产生切割,派生类特有成员消失。object slicing //cout<<e1.level_<<endl;
//m1=e1;
//pe=&m2; // pe=pm2;//error,私有或保护继承的时候,派生类对象指针不可以自动转换成基类对象指针,但可以强制类型转换
pe=reinterpret_cast<Employee*>(pm2);
// e1=m2;//error:私有或保护继承的时候,将派生类直接转化为基类对象 // e1=(Employee)m2;c语言的风格转换
//e1=reinterpret_cast<Employee>(m2);//error,私有或保护继承的时候,将派生类对象无法直接转化为基类对象 pm=static_cast<Manager*>(pe);//基类对象指针可以强制转化为派生类对象指针。这种转化是不安全的
// pm->level_; //error,不安全的原因是:pm->level_,但是level_是不存在的,这是因为由基类转换来的
// m1=static_cast<Manager>(e1);//error,基类对象无法强制转化为派生类对象的转换
// m1=reinterpret_cast<Manager2>(e1);//error,基类对象无法强制转化为派生类对象的转换
return 0;
}
1、static_cast 用于编译器认可的静态转换。比如说从char到int,或者具有转换构造函数。或者重载了类型转换运算符。
2、reinterpret_cast用于编译器不认可的静态转换。从int*转为int,并在转换过程中不做任何对齐
3、const_cast 去除常量性。
4、dynamic_cast 用于动态转换。安全的向下转换。