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>



