派生类到基类的转换
(1)当派生类以public方式继承基类时,编译器可自动执行的转换(向上转型upcasiting 安全转换)
1、派生类对象指针自动转换为基类对象指针
2、派生类对象引用自动转化为基类对象引用
3、派生类对象自动转换为基类对象(特有的成员消失)
(2) 当派生类以private/protected 方式继承基类时
1、派生类对象指针(引用)转换为基类对象指针(引用)需用强制类型转化。但不能用static_cast,要用reinterpret cast
2、不能把派生类对象强制转换为基类对象。
基类到派生类的转换(无private/public约束)
(1)基类对象指针(引用)可以强制类型转换为派生类对象指针(引用),而基类对象无法执行这类转换
(2)向下转型是不安全的,没有自动转换机制
以下是具体demo
#include
#include
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< //m1=e1; // pe=pm2;//error,私有或保护继承的时候,派生类对象指针不可以自动转换成基类对象指针,但可以强制类型转换 // e1=(Employee)m2;c语言的风格转换 pm=static_cast // pm->level_; //error,不安全的原因是:pm->level_,但是level_是不存在的,这是因为由基类转换来的 // m1=static_cast 1、static_cast 用于编译器认可的静态转换。比如说从char到int,或者具有转换构造函数。或者重载了类型转换运算符。 2、reinterpret_cast用于编译器不认可的静态转换。从int*转为int,并在转换过程中不做任何对齐 3、const_cast 去除常量性。 4、dynamic_cast 用于动态转换。安全的向下转换。
//pe=&m2;
pe=reinterpret_cast
// e1=m2;//error:私有或保护继承的时候,将派生类直接转化为基类对象
//e1=reinterpret_cast
// m1=reinterpret_cast
return 0;
}