C++ 使用类成员初始化父类

C++ 使用类成员初始化父类,c++,C++,我有一个基本的iostream派生类,如下所示: class MyStream : public std::basic_iostream< char >, private boost::noncopyable { public: explicit MyStream( SomeUsefulData& data ) : buffer_( data ), std::basic_iostream< c

我有一个基本的iostream派生类,如下所示:

class MyStream : public std::basic_iostream< char >, 
                 private boost::noncopyable
{
public:
    explicit MyStream( SomeUsefulData& data ) : 
        buffer_( data ),
        std::basic_iostream< char >( &buffer_ )
    {
    };

    ~MyStream()
    {
    };

private:
    /// internal stream buffer
   MyStreamBuffer< char > buffer_;
}; // class MyStream
但是,当我创建它的实例时,我会得到一个DataAbort异常

SomeUsefulData data;
MyStream stream( data );  // <- Data Abort
但是,如果我将MyStream更改为heap allocate the MyStreamBuffer,它可以正常工作:

class MyStream : public std::basic_iostream< char >, 
                 private boost::noncopyable
{
public:
    explicit MyStream( SomeUsefulData& data ) : 
        std::basic_iostream< char >( new MyStreamBuffer< char >( data ) )
    {
    };

    ~MyStream()
    {
        delete rdbuf();
    };
}; // class MyStream
使用类成员初始化父类是否错误

谢谢,
PaulH

无论初始化语句的顺序如何,直接基类总是先初始化。 如果您打开更多编译器警告,您应该会得到一个关于此的警告

这意味着是的,用成员初始化基类是错误的,对不起

是的,这是错误的

初始化的顺序是:

基类对象(如果存在) 成员数据对象 构造函数函数代码 因此:

explicit MyStream( SomeUsefulData& data ) : 
    buffer_( data ),
    std::basic_iostream< char >( &buffer_ )
实际上意味着:

explicit MyStream( SomeUsefulData& data ) : 
    std::basic_iostream< char >( &buffer_ ),
    buffer_( data )
这是不对的 请记住,首先构造基类 然后是派生类

这里

您尝试使用尚未构造的缓冲区来初始化基类

explicit MyStream( SomeUsefulData& data ) : 
        ...
        std::basic_iostream< char >( &buffer_ )
    {
    };