派生类与基类的转换

                          派生类到基类的转换

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值