Construction and Destruction Order in Inheritance

What does this print?

#include <iostream>
class Base {
public:
    Base()  { std::cout << "B+"; }
    ~Base() { std::cout << "B-"; }
};
class Mid : public Base {
public:
    Mid()  { std::cout << "M+"; }
    ~Mid() { std::cout << "M-"; }
};
class Derived : public Mid {
public:
    Derived()  { std::cout << "D+"; }
    ~Derived() { std::cout << "D-"; }
};
int main() { Derived d; }