#include #include #include struct Log { std::array items{}; std::size_t used = 0; void add(int n) noexcept { items[used++] = n; } }; struct V { Log& log; V(Log& l, int id) : log(l) { log.add(id); } ~V() { log.add(-1); } }; struct Left : virtual V { explicit Left(Log& l) : V(l, 99) { log.add(2); } ~Left() { log.add(-2); } }; struct Right : virtual V { explicit Right(Log& l) : V(l, 98) { log.add(3); } ~Right() { log.add(-3); } }; struct Member { Log& log; int id; Member(Log& l, int n) : log(l), id(n) { log.add(id); } ~Member() { log.add(-id); } }; struct D : Left, Right { Member first, second; explicit D(Log& l) : V(l, 1), Left(l), Right(l), first(l, 4), second(l, 5) { log.add(6); } ~D() { log.add(-6); } }; int main() { Log log; { D object(log); } const std::array expected{{1, 2, 3, 4, 5, 6, -6, -5, -4, -3, -2, -1}}; assert(log.used == expected.size()); assert(log.items == expected); }