2

以下代码来自这里

#include <streambuf>  // for std::streambuf
#include <ostream>    // for std::ostream

class fdoutbuf
    : public std::streambuf
{
public:
    explicit fdoutbuf( int fd );
    //...
};

class fdostream
    : public std::ostream
{
protected:
    fdoutbuf buf;
public:
    explicit fdostream( int fd ) 
        : buf( fd ), std::ostream( &buf ) // This is not allowed. 
                                          // buf can't be initialized before std::ostream.
        {}
    //...
};

我真的不明白评论。为什么“不能在 std::ostream 之前初始化 buf”?我可以使用一些帮助来理解这一点吗?

4

2 回答 2

8

初始化的顺序由声明类成员的顺序决定,继承的类在所有这些之前。举一个简单的例子来说明基本问题,而不涉及继承:

class C
{
  int a, b;
public:
  C() : b(1), a(b) {} // a is initialized before b!
};

代码不符合你的想法!a 先初始化,然后 b 初始化为 1。所以它取决于声明的顺序而不是初始化列表中的顺序:

int a, b;

现在,同样的想法适用于在派生类成员之前初始化的基类。为了解决这个问题,你创建了一个你固有的类,其中包含你想要从基类初始化的成员。当然,那个助手类必须在你实际派生的那个之前。

于 2011-01-27T11:59:38.463 回答
3

您必须在初始化成员变量之前调用基类构造函数,但是您将指向 buf 的指针(此时未定义的成员变量)传递给此构造函数。

于 2011-01-27T11:55:53.107 回答