C++笔记:派生类到基类转换到可访问性

本文探讨了C++中不同继承方式下派生类到基类的转换规则,并通过具体示例展示了public、protected及private继承时转换的可行性与限制。

提示:要确定到基类的转换是否可访问,可以考虑基类的public成员是否可访问,如果可以,转换是可以访问的,否则,转换是不可访问的。

用户代码,指的是除友元函数,成员函数之外的代码。

后代类,不仅仅指第一级派生类,还包括间接派生自基类的后续的派生类。

派生类,这里专指直接继承类

#include <iostream>
using namespace std;

class A{};

class B:public A
{
public:
	void fun(B &obj)
	{
		A obj1 = obj;
	}
};

class C:protected A
{
public:
	void fun(C &obj)
	{
		A obj1 = obj;
	}
};

class D:private A
{
public:
	void fun(D &obj)
	{
		A obj1 = obj;
	}
};

class E:public B
{
public:
	void fun(B &obj)
	{
		A obj1 = obj;
	}
};

class F:public C
{
public:
	void fun(C &obj)
	{
		A obj1 = obj;
	}
};

//从  private继承类(“D”使用“private”从“A”继承)    派生的类不能转换为基类。
class H:public D
{
public:
	void fun(D &obj)
	{
		A obj1 = obj;  //error C2247: “A”不可访问,因为“D”使用“private”从“A”继承
	}
};

void inherite_test()
{//用户代码
	A *pb, *pc, *pe, *pd, *pf, *ph;

	pb = new B; //public 
	pc = new C; //protected           error C2243: “类型转换”: 从“C *”到“A *”的转换存在,但无法访问    
	pd = new D; //private             error C2243: “类型转换”: 从“D *”到“A *”的转换存在,但无法访问
	pe = new E; //public + public
	pf = new F; //protected + public  error C2243: “类型转换”: 从“F *”到“A *”的转换存在,但无法访问    
	ph = new H; //private + public    error C2243: “类型转换”: 从“H *”到“A *”的转换存在,但无法访问
}
int main(int argc,char* argv[])
{
	inherite_test();

	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值