C++笔记:派生类到基类转换到可访问性
要确定到基类的转换是否可访问,可以考虑基类的public成员是否可访问,如果可以,转换是可以访问的,否则,转换是不可访问的。
如果是public继承,则用户代码和后代类都可以使用派生类到基类的转换。
如果类是使用private或protected继承派生的,则用户代码不能将派生类型对象转换为基类对象。
如果是private继承,则从private继承类派生的类不能转换为基类。
如果是protected继承,则后续派生类的成员可以转换为基类类型。
无论是什么派生访问标号,派生类本身都可以访问基类的public成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。
测试代码:
class A{};
class B:public A{
public:
void fun(B&obj)
{
A obj1 = (A)obj;
}
};
class C:protected A{
public:
void fun(C&obj)
{
A obj1 = (A)obj;
}
};
class D:private A{
public:
void fun(D&obj)
{
A obj1 = (A)obj;
}
};
class E:public B{
public:
void fun(B&obj)
{
A obj1 = (A)obj;
}
};
class F:public C{
public:
void fun(C&obj)
{
A obj1 = (A)obj;
}
};
//从private继承类派生的类不能转换为基类。
class H:public D{
public:
void fun(D&obj)
{
A obj1 = (A)obj; //error C2247: “A”不可访问,因为“D”使用“private”从“A”继承
//error C2243: “类型转换”: 从“D *”到“const 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 *”的转换存在,但无法访问
}