Every class X has a default compiler-provided constructor X::X() which you can override if necessary.
In your example five constructors will be called; two bases, derived1, derived2 and derived3.
Not sure which order it'll be done in or if that order is guaranteed, but you could try adding something like
class derived2:base
    int k;
    derived2() { cout << "In derived2 ctor\n"; }
to see what's going on internally.

I'm not sure I understand what you're getting at regarding constructors and sizeof this; there is only one sizeof called and that's sizeof(a). The compiler can determine the size from the code; this isn't determined at runtime.