使用类成员初始化父类

时间:2009-12-18 15:58:22

标签: c++

我有一个这样的basic_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更改为堆分配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

3 个答案:

答案 0 :(得分:6)

无论您将初始化语句放入何种顺序,都始终首先初始化直接基类。 如果您打开更多编译器警告,则应该收到有关此警告的警告。

这意味着是的,使用成员初始化基类是不对的,抱歉!

答案 1 :(得分:2)

是的,这是错的。

初始化的顺序是:

  1. 基类对象(如果存在)
  2. 会员数据对象
  3. 构造函数功能代码
  4. 所以这个:

    explicit MyStream( SomeUsefulData& data ) : 
        buffer_( data ),
        std::basic_iostream< char >( &buffer_ )
    

    实际意味着:

    explicit MyStream( SomeUsefulData& data ) : 
        std::basic_iostream< char >( &buffer_ ),
        buffer_( data )
    

答案 2 :(得分:0)

错了 记得首先构造基类 然后是派生类

这里

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

您尝试使用尚未构造的buffer_初始化基类