From my point of view, the output means that the constructor base is always called whenever an INSTANCE of its derived class is created, in this case, class BD. And of course, like nested loops, the last initiated class comes first(in this case, the derived class BD) and the first to be called comes last. In short, it does not follow the FIFO(First In First Out) rule. And oh, one more thing, constructor calls destructor(~classname) whenever it gets out of scope, or deleted(dynamically). I hope it helps. :)
if i modify the code and take our virtual from the first destructor the output is as follows
Base OK Derived OK Base DEL
If function (destructor in this case) is not virtual, it will be called based on type of pointer/reference and not on real type of object it contains. If your BD class adds some data, it will never be released, leading to incomplete destruction.