1.转化与继承
派生类对象也是基类对象。这意味着在使用基类的地方可以派生类来替换。
2.派生类到基类的转换
(1) 当派生类以public方式继承基类时,编译器可自动执行的转换(向上转行upcasting安全转换)
[1]派生类对象指针自动转化为基类对象指针
[2]派生类对象引用自动转化为基类对象引用
[3]派生类对象自动转化为基类对象(特有的成员消失)
(2)当派生类以private/protected方式继承基类时
[1]派生类对象指针(引用)转化为基类对象指针(引用)需用强制类型转化。但不能用static_cast,要用reinterpret_cast
[2]不能把派生类对象强制转换为基类对象
#include <iostream>
using namespace std;
class Employee {
public:
Employee(const string& name, const int age, const int deptno) : name_(name), age_(age), deptno_(deptno) {
}
public:
string name_;
int age_;
int deptno_;
};
class Manager : public Employee {
public:
Manager(const string& name, const int age, const int deptno, int leve1) : Employee(name, age, deptno), leve1_(leve1) {
}
private:
int leve1_;
};
class Manager2 : private Employee {
public:
Manager2(const string& name, const int age, const int deptno, int leve1) : Employee(name, age, deptno), leve1_(leve1) {
}
private:
int leve1_;
};
int main(void) {
Employee e1("zhangsan", 25, 20);
Manager m1("lisi", 38, 20 ,10);
Manager2 m2("wangwu", 40, 15 ,8);
Employee* pe;
Manager* pm;
Manager2* pm2;
pe = &e1;
pm = & m1;
pm2 = & m2;
//1.-------------派生类字刚氇转化为基类指针-------
pe = &m1; //派生类指针可以转化为基类指针。将派生类对象看成基类对象
pe = pm;
//pm = &e1; //基类指针无法转化为派生类指针。无法将基类对象看成是派生类对象
//2.----------------派生类对象转化为基类对象------------------
e1 = m1; //派生类对象可以转化为基类对象。将派生类对象看成基类对象
//会产生对象切割(派生类特有成员消失)。object slicing
//3.---------------private,protected派生类指针转化为 基类指针----------------
//pe = pm2; //私有或保护继承的时候,派生类对象指针不可以自动转化为基类对象指针
//pe = static_cast<Employee*>(pm2);
pe = reinterpret_cast<Employee*>(pm2);
pe = (Employee*)pm2;
//4.--------------private,protected派生类对象转化为基类对象-----------------
//e1 = m2; // 私有或保护继承的时候,派生类对象无法转化基类对象
//e1 = reinterpret<Employee>(m2); // 私有或保护继承的时候,派生类对象无强? 转化 为基类对象
//5.-----------基类指针 转化为 派生类指针--------------------
pm = static_cast<Manager*>(pe); //基类指针可以强制转化为派生类指针,但是不安全
pm2 = reinterpret_cast<Manager2*>(pe);
//6.-----------基类对象 转化为 派生类对象 ----------------
//m1 = reinterpret_cast<Manager>e1; //基类对象无法转为派生类对象
return 0;
}
3.基类到派生类的转换
(1)基类对象指针(引用)可用强制类型转换为派生类对象指针(引用),而基类对象无法执行这类转换
(2)向下转型不安全,没有自动转换的机制
#include <iostream>
using namespace std;
class Manager;
class Employee {
public:
Employee(const string& name, const int age, const int deptno) : name_(name), age_(age), deptno_(deptno) {
cout << "Employee(const string& name, const int age, const int deptno)" << endl;
}
operator Manager();
public:
string name_;
int age_;
int deptno_;
};
class Manager : public Employee {
public:
Manager(const string& name, const int age, const int deptno, int leve1) : Employee(name, age, deptno), leve1_(leve1) {
}
//从语法上来演示基类对象可以转化为派生类对象,但是没有意义
/*Manager(const Employee& other): Employee(other), leve1_(-1) {
cout << "Manager(const Employee& other)" << endl;
}*/
private:
int leve1_;
};
//语法上来演示基类对象可以转化为派生类对象,但是没有意义
Employee::operator Manager() {
return Manager(name_, age_, deptno_, -1);
}
int main(void) {
Employee e1("zhangsan", 25, 20);
Manager m1("lisi", 38, 20 ,10);
m1 = e1;
return 0;
}
转换构造函数,将其它类型转换为类类型
类型转换运算符重载,将类类型转换为其它类型