C++Primer第617页,
习题17.25 给定下面的类层次,其中每个类定义了一个默认构造函数,
class X{...};
class A{...};
class B : public A {...};
class C : public B {...};
class D : public X, public C {...};
如果有,下面的转换中哪些是不允许的?
D *pd = new D;
(a) X* px = pd; (c) B* pb = pd;
(b) A* pa = pd; (d) C* pc = pd;
敲代码果然是
error C2243:“类型转换”: 从派生类指针到基类指针的转换存在,但无法访问
答案是
b,c是不允许的,因为C对B的继承是私有继承,使得在D中B的构造函数是不可访问的,所以存在从"D*"到"B*"以及从"D*"到"A*"的转换,但这些转换不可访问
C++Primer第487页
15.3转换与继承
好像有一句话说的是引用和指针只是绑定到派生类的子类部分,而非进行类型的转换,对象类型还是子类类型~既然这样,为什么绑定指针和引用的时候会报这个错误啊~
1.基类引用和指针只是绑定到派生类的子类部分,而非进行类型的转换,对象类型还是子类类型
上面这句话对不对?
派生类的基类部分 不是子类部分
class A{public: A(){cout<<this<<endl;} void fun(){cout<<this<<endl;}};class B:public A{}; B b; A&a=b; a.fun(); A aa=b; aa.fun(); A*aaa=&b; aaa->fun();没有数据的拷贝 操作的还是子类对象
2.如果上面这句话是对的~那么为什么绑定的时候会报这个错误?进行了什么转换?内部实现的步骤又是什么?
如果是私有继承,基类的成员(private除外)在派生类中都是私有的
如果构造了这样的派生类对象,再赋值给基类,那基类就变的毫无意义了。因为他的所有操作都是外界不能访问的,那还有什么用呢
3.如果不对,那内部实现的步骤是什么?
见上面解释
2.如果上面这句话是对的~那么为什么绑定的时候会报这个错误?进行了什么转换?内部实现的步骤又是什么?
如果是私有继承,基类的成员(private除外)在派生类中都是私有的
如果构造了这样的派生类对象,再赋值给基类,那基类就变的毫无意义了。因为他的所有操作都是外界不能访问的,那还有什么用呢
3.如果不对,那内部实现的步骤是什么?
见上面解释

浙公网安备 33010602011771号