没想到书上的短短几句话,我竟研究了一个晚上,不多说了,请看派生类到基类转换的可访问规则:
访问规则: 1.如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换。 2.如果类是使用 private 或 protected继承派生的,则用户代码(即派生类对象)不能将派生类型对象转换为基类对象。 3.如果是 private 继承,则从 private 继承类派生的类不能转换为基类。 4.如果是 protected 继承,则后续派生类的成员可以转换为基类类型。 5.无论是什么派生访问标号,派生类本身都可以访问基类的 public 成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。 |
下面是我的验证代码:
//p489 派生类到基类转换的可访问性
#include<iostream>
using namespace std;
class A{};
class B:public A{};
class C:protected A{};
class D:private A{};
class E:public B{};
class F:public C{};
class G:public D{};
int main(){
A *pb, *pc, *pd, *pe, *pf, *pg;
pb = new B; // 正确 public派生,可以转换[*B ---> *A].
pc = new C; // 错误 protected派生,不可转换[*C -\-> *A].
pd = new D; // 错误 private派生,不可转换[*D -\-> *A].
pe = new E; // 正确 public派生的子类,可以转换[*E ---> *A].
pf = new F; // 错误(按话的意思是正确,但VC编译是错误)protected派生的子类.
pg = new G; // 错误 private派生的子类,不可转换[*G -\-> *A].
return 0;
}