C++中的Base-from-Member Idiom

Naw*_*waz 1 c++ idioms ostream initialization-list

下面的代码是从这里:

#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.
        {}
    //...
};
Run Code Online (Sandbox Code Playgroud)

我真的不明白这个评论.为什么"在std :: ostream之前无法初始化buf"?我可以用一些帮助来理解这个吗?

Ara*_*raK 7

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

class C
{
  int a, b;
public:
  C() : b(1), a(b) {} // a is initialized before b!
};
Run Code Online (Sandbox Code Playgroud)

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

int a, b;
Run Code Online (Sandbox Code Playgroud)

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