c++ 派生类 拷贝构造函数 调用基类的构造函数

在进入派生类(derived)的拷贝构造函数之前,就已经调用了基类(based)的构造函数,
无论你有没有显示的调用。
一般派生类是这种形式:
derived(const derived & d):based(d)
{}

为什么使用下列形式不行
derived(const derived & d)
{
based::based(d);
}
即在派生类构造函数内部调用基类构造函数。调试的时候发现无法访问基类的私有成员。
为什么使用初始化列表就可以访问基类的私有成员

1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
2.const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。
以上两种只能使用初始化列表去初始化。一般情况下,选用初始化列表初始化。
另外,不能直接使用父类的构造器,原因是父类的构造器是不能被子类继承的。
构造函数也不能被当做一般的函数来使用。

based::based(d); 这个会生成一个独立的based的对象吧,和派生的derived对象没关系

恩,有一点道理。主要还有一点,在初始化列表:based(d)中可以访问基类的私有成员,而在based::based(d)中,则访问失败

我看c++时好像没有看到based::based();这个,这个是创建对象,创建对象应该是based b;这样吧?

based::based(d),调用基类的拷贝构造函数

derived(const derived &d)
{
based b(d);
}
楼主改为这样就可以访问了。。。。

希望楼上说的再清楚一点:
1.如果提供了默认构造函数,也就是基类先被初始化一次,再用based::based(d)初始化一次好像没什么问题
2.const成员这一点,没听明白
3.构造函数不能当一般函数使用,能否具体说明

派生类构造函数中的based(d)会认为是用参数d来初始化一个临时变量,而初始化列表只提供初始化功能,并没有产生新的对象

 class BB;
class AA
{
public:
    AA(){};
    AA(const AA&){};
private:
    AA(const BB&){};


};
class BB    :private AA
{
public:
    BB(){};
    BB(const BB& bb)    :AA(static_cast<const AA&>(bb))
    {
        AA::AA(bb); //  难首是编译器不同??只有这样才会出现楼主所说的状态
    }
};