S
Stub
Please answer my questions below - thanks!
1. Why "Derived constructor" is called but "Derived destructor" not in Case
1 since object B is new'ed from Derived class?
2. Why "Derived destructor" is called in Case 2 since only ~base() becomes
"virtual" and ~Derived() is still non-virtual?
3. Does Case 3 show that we don't need any virtual destructor to make
~Derived() called?
4. Is "virtual destructor" needed only for Case 2?
Case 1:
========
class base
{
public:
~base() { cout << "Base destructor\n"; }
};
class Derived : public base
{
public:
Derived() { cout << "Derived constructor\n"; }
~Derived() { cout << "Derived destructor\n"; }
};
int main(){
base* B = new Derived;
delete B;
return 0;
}
OUTPUT:
Derived constructor
Base destructor
Case 2:
========
class base
{
public:
virtual ~base() { cout << "Base destructor\n"; }
};
class Derived : public base
{
public:
Derived() { cout << "Derived constructor\n"; }
~Derived() { cout << "Derived destructor\n" }
};
int main () {
base* B = new Derived;
delete B;
return 0;
}
OUTPUT:
Derived constructor
Derived destructor
Base destructor
Case 3:
=========
class base
{
public:
~base() { cout << "Base destructor\n"; }
};
class Derived : public base
{
public:
Derived() { cout << "Derived constructor\n"; }
~Derived() { cout << "Derived destructor\n" }
};
int main () {
Derived* B = new Derived;
delete B;
return 0;
}
OUTPUT:
Derived constructor
Derived destructor
Base destructor
1. Why "Derived constructor" is called but "Derived destructor" not in Case
1 since object B is new'ed from Derived class?
2. Why "Derived destructor" is called in Case 2 since only ~base() becomes
"virtual" and ~Derived() is still non-virtual?
3. Does Case 3 show that we don't need any virtual destructor to make
~Derived() called?
4. Is "virtual destructor" needed only for Case 2?
Case 1:
========
class base
{
public:
~base() { cout << "Base destructor\n"; }
};
class Derived : public base
{
public:
Derived() { cout << "Derived constructor\n"; }
~Derived() { cout << "Derived destructor\n"; }
};
int main(){
base* B = new Derived;
delete B;
return 0;
}
OUTPUT:
Derived constructor
Base destructor
Case 2:
========
class base
{
public:
virtual ~base() { cout << "Base destructor\n"; }
};
class Derived : public base
{
public:
Derived() { cout << "Derived constructor\n"; }
~Derived() { cout << "Derived destructor\n" }
};
int main () {
base* B = new Derived;
delete B;
return 0;
}
OUTPUT:
Derived constructor
Derived destructor
Base destructor
Case 3:
=========
class base
{
public:
~base() { cout << "Base destructor\n"; }
};
class Derived : public base
{
public:
Derived() { cout << "Derived constructor\n"; }
~Derived() { cout << "Derived destructor\n" }
};
int main () {
Derived* B = new Derived;
delete B;
return 0;
}
OUTPUT:
Derived constructor
Derived destructor
Base destructor