派生类到基类的转换

(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 用于动态转换。安全的向下转换。