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.如果不对,那内部实现的步骤是什么?
见上面解释

 

posted on 2014-10-13 16:22  风云逸  阅读(201)  评论(0)    收藏  举报