B
BeautifulMind
In case of inheritence the order of execution of constructors is in
the order of derivation and order of destructor execution is in
reverse order of derivation.
Is this case also true in case class is derived as virtual?
How does the order of construction/destruction is impacted if the base
class is derived as virtual or non virtual? just see the example
below.
I am using VS6/SP6. what the standard say on this.
#include <iostream>
using namespace std;
class A
{
int val;
public:
~A(){cout <<"~A()\n";}
A() { cout <<"A()\n"; }
};
class B{
int val;
public:
~B(){cout <<"~B()\n";}
B(){cout <<"B()\n";}
};
class C
{
int val;
public:
~C(){cout <<"~C()\n";}
C(){cout <<"C()\n";}
};
class F
{
int val;
public:
~F(){cout <<"~F()\n";}
F(){cout <<"F()\n";}
};
class D: public A, public B, public C, public F
{
int val;
public:
~D(){cout <<"~D()\n";}
D(){cout <<"D()\n";}
};
class K: public A, virtual public B, public C, public F
{
int val;
public:
~K(){cout <<"~K()\n";}
K(){cout <<"K()\n";}
};
class L: public A, virtual public B, virtual public C, public F
{
int val;
public:
~L(){cout <<"~L()\n";}
L(){cout <<"L()\n";}
};
int main()
{
{
cout << "For D\n\n";
D obj;
}
{
cout << "For K\n\n";
K obj;
}
{
cout << "For L\n\n";
L obj;
}
return 0;
}
/*
Output is:
For D
A()
B()
C()
F()
D()
~D()
~F()
~C()
~B()
~A()
For K
B()
A()
C()
F()
K()
~K()
~F()
~C()
~A()
~B()
For L
B()
C()
A()
F()
L()
~L()
~F()
~A()
~C()
~B()
*/
the order of derivation and order of destructor execution is in
reverse order of derivation.
Is this case also true in case class is derived as virtual?
How does the order of construction/destruction is impacted if the base
class is derived as virtual or non virtual? just see the example
below.
I am using VS6/SP6. what the standard say on this.
#include <iostream>
using namespace std;
class A
{
int val;
public:
~A(){cout <<"~A()\n";}
A() { cout <<"A()\n"; }
};
class B{
int val;
public:
~B(){cout <<"~B()\n";}
B(){cout <<"B()\n";}
};
class C
{
int val;
public:
~C(){cout <<"~C()\n";}
C(){cout <<"C()\n";}
};
class F
{
int val;
public:
~F(){cout <<"~F()\n";}
F(){cout <<"F()\n";}
};
class D: public A, public B, public C, public F
{
int val;
public:
~D(){cout <<"~D()\n";}
D(){cout <<"D()\n";}
};
class K: public A, virtual public B, public C, public F
{
int val;
public:
~K(){cout <<"~K()\n";}
K(){cout <<"K()\n";}
};
class L: public A, virtual public B, virtual public C, public F
{
int val;
public:
~L(){cout <<"~L()\n";}
L(){cout <<"L()\n";}
};
int main()
{
{
cout << "For D\n\n";
D obj;
}
{
cout << "For K\n\n";
K obj;
}
{
cout << "For L\n\n";
L obj;
}
return 0;
}
/*
Output is:
For D
A()
B()
C()
F()
D()
~D()
~F()
~C()
~B()
~A()
For K
B()
A()
C()
F()
K()
~K()
~F()
~C()
~A()
~B()
For L
B()
C()
A()
F()
L()
~L()
~F()
~A()
~C()
~B()
*/