C++ PRIMER第四版中15.3节中讲解派生类到基类转换的可访问性,
给出的规则如下:
1.如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换。
2.如果类是使用 private 或 protected 继承派生的,则用户代码不能将派生类型对象转换为基类对象。
3.如果是 private 继承,则从 private 继承类派生的类不能转换为基类。
4.如果是 protected 继承,则后续派生类的成员可以转换为基类类型。
5.无论是什么派生访问标号,派生类本身都可以访问基类的 public 成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。
检验代码如下:
class c00
{
private:
int c00a;
};
class c10 : public c00
{
private:
int c10a;
public:
void f(const c00 & c) // ok 规则1
{
}
};
class c11 : protected c00
{
private:
int c11a;
public:
void f(const c00 & c) // ok 规则5
{
}
};
class c12 : private c00
{
private:
int c12a;
public:
void f(const c00 & c) //ok 规则5
{
}
};
class c21 : public c11
{
private:
int c21a;
public:
void f(const c00 & c) // ok 规则4
{
}
};
class c22 : public c12
{
private:
int c22a;
public:
void f(const c00 & c) //error 规则3
{
}
};
void f(const c00 & c)
{
}
void main()
{
c10 t10;
c11 t11;
c12 t12;
f(t10); // ok 规则1
f(t11); //error 规则2
f(t12); //error 规则2
}