> 派生类对象也是基类对象。这意味着在使用基类的地方也可用派生类来替换。
派生类到基类公有继承的转换
#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)
{
}
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)
{
}
private:
int level_;//级别
};
int main(void)
{
Employee e1("zhangsan",23,23);
Manager m1("lisi",38,38,38);
Employee* pe;
Manager* pm;
pe=&e1;//基类指针指向基类对象 可以的。
pm=&m1;//派生类指针指向派生类对象 可以的。
pe=&m1;//基类指针可以指向派生类对象 或者 派生类指针可以转换成基类指针
//pm=&e1;//error 派生类指针无法指向派生类对象 “Employee *”转换为“Manager *”,无法将基类对象看成是派生类对象
e1=m1;//派生类对象可以转换基类对象,转换的过程中,派生类的特有成员消失了。
//会产生对象切割(派生类特有成员消失) objecct slicing
return 0;
}
派生类到基类私有继承的转换
#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)
{
}
private:
string name_;
int age_;
int deptno_;//部门号
};
class Manager:private Employee
{
public:
Manager(const string& name,const int age,const int deptno,int level)
:Employee(name,age,deptno),level_(level)
{
}
private:
int level_;//级别
};
int main(void)
{
Employee e1("zhangsan",23,23);
Manager m1("lisi",38,38,38);
Employee* pe;
Manager* pm;
//================私有,保护继承测试============
pm=&m1;
///pe=pm; error //私有方式或者保户继承,派生类指针不可以转换成基类指针 但是可以强制转换
//pe=static_cast<Employee*>(pm); error static_cast 也不行
pe=(Employee*)(pm);//这种强制转换是可以的。
//也可以用
pe=reinterpret_cast<Employee*>(pm);
//e1=m1;//error 不可将派生类转换成基类对象,即使是强制转换也不行。
//转型回顾
//1,static_cast 用户编译器认可的静态转换.比如从char 到int,从 double 到int.或者 具有转换构造函数,或者重载了类型转换运算符
//2,reinterpret_cast 重新解释。 用户编译器不认可的静态转换。从int* 转为int,不做任何的对其操作
//3,const_cast 去掉常量性
//4,dynamic_cast 用户动态转换,安全的向下转型。多态。
//==================下面是公有测试===========
//pe=&e1;//基类指针指向基类对象 可以的。
//pm=&m1;//派生类指针指向派生类对象 可以的。
//pe=&m1;//基类指针可以指向派生类对象 或者 派生类指针可以转换成基类指针
pm=&e1;//error 派生类指针无法指向派生类对象 “Employee *”转换为“Manager *”,无法将基类对象看成是派生类对象
// e1=m1;//派生类对象可以转换基类对象,转换的过程中,派生类的特有成员消失了。
// //会产生对象切割(派生类特有成员消失) objecct slicing
return 0;
}
#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)
{
}
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)
{
}
private:
int level_;//级别
};
int main(void)
{
Employee e1("zhangsan",23,23);
Manager m1("lisi",38,38,38);
Employee* pe;
Manager* pm;
//pm=pe;//不能直接转换,但是可以强制转换
pm=static_cast<Manager*>(pe);//基类指针可以强制转化成为派生类指针。但是不安全。
//pm->level_; 可能访问到基类没有的成员。 而这个成员实际上是不存在的。
//m1=e1;//基类对象无法强制转化为派生类对象 强制也不行。
return 0;
}