See below pictures, each steps have different memory block.

and below is example source for this.

#include <iostream>
using namespace std;

#define _VIRTUAL_
#define _DOUBLE_
//-------------------------------------------
class A{
private:
 int data;
public: 
 A(int data= -123){
 this->data = data;
 }
 int print(){
 cout<<"A: "<<data<<endl;
 return data;
 }
 ~A(){cout<<"~A:"<<data<<endl;}
};
//-------------------------------------------
#ifdef _VIRTUAL_
class B:virtual public A{
#else
class B:public A{
#endif
private:
 int data;
public: 
 B(int data = -2):A(data*4){
 this->data = data;
 }
 int print(){
 A::print();
 cout<<"B: "<<data<<endl;
 return data;
 }
 ~B(){ cout<<"~B:"<<data<<endl;  }
};
//-------------------------------------------
#ifdef _DOUBLE_
#ifdef _VIRTUAL_
class C:virtual public A{
#else
class C:public A{
#endif
private:
 int data;
public: 
 C(int data = -3):A(data*3){
 this->data = data;
 }
 int print(){
 A::print();
 cout<<"c: "<<data<<endl;
 return data;
 }
 ~C(){ cout<<"~C:"<<data<<endl;  }
};
#endif
//-------------------------------------------
#ifdef _DOUBLE_
class D:public B, public C{
#else
class D:public B{
#endif
private:
 int data;
public: 
#ifdef _DOUBLE_
 D(int data):B(10),C(20){
#else
 D(int data):B(10){
#endif
 this->data = data;
 }
 int print(){
 B::print();
#ifdef _DOUBLE_
 C::print();
#endif
 cout<<"D: "<<data<<endl;
 return data;
 }
 ~D(){ cout<<"~D:"<<data<<endl;  }
};
//-------------------------------------------
int main(){
 //B bb(10);
 D x(10);
 x.print();
 A(B(x)).print();
 return 0;
}

<pre>
<pre>