继承(三)

本文探讨了C++中不同类型转换的细节,包括派生类到基类的自动转换和基类到派生类的手动转换。文章通过具体代码示例展示了不同继承方式下类型转换的特点,并解释了向上转型和向下转型的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

转换构造函数,将其它类型转换为类类型

类型转换运算符重载,将类类型转换为其它类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值