子类和父类之间类型转换

本文探讨了在面向对象编程中,子类与父类之间的类型转换,包括public继承和private继承的情况。通过实例展示了类型转换函数class_con的使用,以及如何通过指针和引用进行转换。重点讨论了private继承时,父类成员在子类中变为private,但通过特定方式仍能访问的情况。

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

1. 子类 -> 父类

父类 -> Base

#include<isotream>
using namespace std;

class Base{
public:
	Base() : pub_att(1){}
	int pub_att;
};

public继承的子类1 -> Derived1

class Derived1 : public Base{
public: 
	Derived1() : att(2){}
	int att;
};

private继承的子类2 -> Derived2

class Derived2 : private Base{
public: 
	Derived2() : att(3){}
	int att;
};

需要类型转换的函数 -> class_con

void class_con(Base & A_Base){
	cout << "class_con is called!" << endl;
	cout << "Base::pub_att = " << A_Base.pub_att << endl;
}

声明对象

int main(){
	Derived1 A_Derived1;
	Derived2 A_Derived2;

	Base A_Base1, A_Base2;

对象转型

public继承的子类对象自动向上转型

	A_Base1 = A_Derived1;

private继承的子类对象不可转型

	//A_Base2 = (Base)A_Derived2;

指针和引用转型

public继承的对象指针和引用自动向上转型

	Base * base_ptr1 = &A_Derived1; //指针
	class_con(A_Derived1); //引用

private继承的对象指针和引用普通强制转型

	Base * base_ptr2 = (Base *)&A_Derived2; //指针
	class_con((Base &)A_Derived2); //引用
}

输出:

class_con is called!
Base::pub_att = 1
class_con is called!
Base::pub_att = 1
  1. 父类型指针和引用还是会访问父类型的成员!
  2. private继承的对象指针和引用,父类的成员子类全部继承为private,普通强制转型后,将恢复为原来的public,所以使用class_on函数可以访问父类(见1)的pub_att。

2. 父类 -> 子类

#include<iostream>
using namespace std;

父类

class Base{
private:
	int pri_att;
public:
	Base() : pri_att(1){}
};

子类


class Derived : public Base{
public: 
	int Derived_att;
	Derived() : Derived_att(2) {}
};

传指针,传引用,传值

void class_cast_ptr(Derived * A_Derived){
	cout << "A_Derived->Derived_att = "
		 << A_Derived->Derived_att << endl;
}

void class_cast_ref(Derived & A_Derived){
	cout << "A_Derived.Derived_att = "
		<< A_Derived.Derived_att << endl;
}

void class_cast_val(Derived A_Derived){
	cout << "A_Derived.Derived_att = "
		<< A_Derived.Derived_att << endl;
	
};

int main(){

	Base A_Base;

对象转型

任何对象不可向下转型

	//class_cat_val(static_cast<Derived>(A_Base));

指针和引用转型

父类对象指针static_cast强制向下转型

	Base * base_ptr = new Derived; //  public继承的子类对象指针自动向上转型
	class_cast_ptr(static_cast<Derived *>(base_ptr));

父类对象引用static_cast强制向下转型

	class_cast_ref(static_cast<Derived &>(A_Base));
}

输出:

A_Derived->Derived_att = 2
A_Derived.Derived_att = 2096008816
  1. 子类对象指针先向上转型,又向下转型,所以子类对象有值(子类指针访问子类成员),A_Derived->Derived_att = 2!!
  2. 父类对象指针直接向下转型,所以子类对象无值,不可知,A_Derived.Derived_att = 2096008816
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值