Bases Before Members

#include <iostream>

struct Trace {
    const char* n;
    explicit Trace(const char* s) : n(s) { std::cout << "+" << n; }
    ~Trace() { std::cout << "-" << n; }
};

struct Base {
    Trace t{"B"};
    Base()  { std::cout << "(B)"; }
    ~Base() { std::cout << "[B]"; }
};

struct Member { Trace t{"M"}; };

struct Derived : Base {
    Member m;
    Trace  t{"D"};
    Derived()  { std::cout << "(D)"; }
    ~Derived() { std::cout << "[D]"; }
};

int main() {
    Derived d;
    std::cout << "|";
}

What is the exact output?

A

+B(B)+M+D(D)|-D-M[D][B]-B

B

+B(B)+M+D(D)|[D]-D-M[B]-B

C

+B(B)+M+D(D)|[D]-M-D[B]-B

D

+M+D+B(B)(D)|[D]-D-M[B]-B