提示:要确定到基类的转换是否可访问,可以考虑基类的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;
}