#include
#include
struct A { int a; };
struct B : virtual A { int b; };
struct C : virtual A { int c; };
struct D : B,C { int d; };
in
There are two things happening in a new expression:
Allocating memory for a type by calling operator new (which is no new expression)
Construction of the desired type.
Usually the operator new can utilize the size, which is passed by the compiler inside the new expression. Having a placement new (offering storage), the programmer is responsible to provide a storage large enough to hold the desired type.
Anyway: Do not mix allocation and object construction. These are two distinct tasks.