首页 > 编程 > C++ > 正文

C++继承(二)

2019-11-08 02:18:27
字体:
来源:转载
供稿:网友
既然继承允许派生类访问基础类的成员,那么,也存在派生类和基类之间的相互转换。派生类到基类的转换:派生类对象也是基类对象,这意味着使用到基类的地方都可以用派生类来转换(派生类的范围比基类大)。又称**向上转型**(upcasting),这是一种安全的转型。当派生类以public方式继承基类时,编译器可自动执行转换。 1. 派生类对象指针自动转换为基类对象指针 2. 派生类对象引用自动转换为基类对象引用 3. 派生类对象自动转换为基类对象(特有的成员消失)当派生类以PRivate或protected方式继承时 1. 派生类对象指针(引用)转换为基类对象指针(引用)需用强制类型转换。但不能用static_cast,要用reterpret_cast。 2. 不能强制把派生类对象转换为基类对象。下面是一个简单的例子来说明向上转型#include<iostream>#include<string>using namespace std;class Employee{ public: Employee(const string s,int age,int depnum) :name(s),age_(age),depnum_(depnum) { } private: string name; int age_; int depnum_; };class Manager : public Employee { public: Manager(const string s,int age,int depnum,int level) :Employee(s,age,depnum),level_(level) //调用基类的构造函数 { } private: int level_;};class Manager2 : private Employee{ public: Manager2(const string s,int age,int depnum,int level) :Employee(s,age,depnum),level_(level) //调用基类的构造函数 { } private: int level_;}; //向上转型upcasting int main(){ Employee e1("Zhangsan",25,10); Manager m1("Lisi",32,10,2); Manager2 m2("wangwu",38,10,4); Employee *pe = &e1; //基类类型指针指向基类对象 Manager *pm = &m1; //派生类类型指针指向派生类对象 Manager2 *pm2; pm2 = &m2; pe = &m1; //向上转换,基类指针指向派生类对象 //pm = &e1; 无法从基类指针转换为派生类指针 e1 = m1; //派生类对象转换为基类对象,(派生类的特有成员消失) pe = pm; //派生类对象的指针自动转换成基类对象指针// e1 = m2; // 私有或保护继承时,派生类对象无法(强制)转换为基类对象 // pe = &m2; 私有或保护继承时, 派生类指针不可以转换成基类指针,但可以强制转换 pe = reinterpret_cast<Employee*>(pm2); // pe = (Employee*)pm2; 与上一行作用相同 pe = (Employee*)&m2; //c风格的强制转换 return 0;}基类到派生类的转换: 基类对象的指针或引用可以用用强制类型转换为派生类的对象指针(引用),而基类对象无法执行这类转换。 向下转型不安全,没有自动的转换机制。具体的做法有在派生类中编写转换构造函数或者在基类中重载类型转换运算符。但没有多大的实际意义。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选