Skip to main content
Stack Overflow
  1. About
  2. For Teams

Return to Answer

fixed an error
Source Link

A virtual constructor is not possible but virtual destructor is possible. Let us experiment.......

#include <iostream>
using namespace std;
class Base
{
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The above code output the following:

Base Constructor Called
Derived constructor called
Base Destructor called

The construction of derived object follow the construction rule but when we delete the "b" pointer(base pointer) we have found that only the base destructor is called. But this must not be happen. To do the appropriate thing, we have to make the base destructor virtual. Now let see what happens in the following:

#include <iostream>
using namespace std;
class Base
{ 
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 virtual ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The output changed as following:

Base Constructor Called
Derived Constructor called
Derived destructor called
Base destructor called

So the destruction of the base pointer (which takes an allocation on derived object!) follows the destruction rule, i.e first the Derived, then the Base. On the other hand, there is nothing like a virtual constructor.

A virtual constructor is not possible but virtual destructor is possible. Let us experiment....

#include <iostream>
using namespace std;
class Base
{
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The above code output the following:

Base Constructor Called
Derived constructor called
Base Destructor called

The construction of derived object follow the construction rule but when we delete the "b" pointer(base pointer) we have found that only the base destructor is called. But this must not be happen. To do the appropriate thing, we have to make the base destructor virtual. Now let see what happens in the following:

#include <iostream>
using namespace std;
class Base
{ 
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 virtual ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The output changed as following:

Base Constructor Called
Derived Constructor called
Derived destructor called
Base destructor called

So the destruction of the base pointer (which takes an allocation on derived object!) follows the destruction rule, i.e first the Derived, then the Base. On the other hand, there is nothing like a virtual constructor.

A virtual constructor is not possible but virtual destructor is possible. Let us experiment.......

#include <iostream>
using namespace std;
class Base
{
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The above code output the following:

Base Constructor Called
Derived constructor called
Base Destructor called

The construction of derived object follow the construction rule but when we delete the "b" pointer(base pointer) we have found that only the base destructor is called. But this must not happen. To do the appropriate thing, we have to make the base destructor virtual. Now let see what happens in the following:

#include <iostream>
using namespace std;
class Base
{ 
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 virtual ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The output changed as following:

Base Constructor Called
Derived Constructor called
Derived destructor called
Base destructor called

So the destruction of the base pointer (which takes an allocation on derived object!) follows the destruction rule, i.e first the Derived, then the Base. On the other hand, there is nothing like a virtual constructor.

A virtual constructor is not possible but virtual destructor is possible. Let us experiment....

#include <iostream>
using namespace std;
class Base
{
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The above code output the following:

Base Constructor Called
Derived constructor called
Base Destructor called

The construction of derived object follow the construction rule but when we delete the "b" pointer(base pointer) we have found that only the base destructor is callcalled.But But this must not be happenedhappen. To do the appropriate thing, we have to make the base destructor virtual. Now let see what happenhappens in the following:

#include <iostream>
using namespace std;
class Base
{ 
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 virtual ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The output changed as following:

Base Constructor Called
Derived constructorConstructor called
Derived destructor called
Base Destructordestructor called

So the destruction of the base pointer(which taketakes an allocation on derived object!) followfollows the destruction rule, i.e first the derivedDerived, then the baseBase. On the other hand for constructor, there areis nothing like a virtual constructor.

A virtual constructor is not possible but virtual destructor is possible. Let us experiment....

#include <iostream>
using namespace std;
class Base
{
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The above code output the following:

Base Constructor Called
Derived constructor called
Base Destructor called

The construction of derived object follow the construction rule but when we delete the "b" pointer(base pointer) we have found that only the base destructor is call.But this must not be happened. To do the appropriate thing we have to make the base destructor virtual. Now let see what happen in the following:

#include <iostream>
using namespace std;
class Base
{ 
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 virtual ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The output changed as following:

Base Constructor Called
Derived constructor called
Derived destructor called
Base Destructor called

So the destruction of base pointer(which take an allocation on derived object!) follow the destruction rule i.e first the derived then the base. On the other hand for constructor there are nothing like virtual constructor.

A virtual constructor is not possible but virtual destructor is possible. Let us experiment....

#include <iostream>
using namespace std;
class Base
{
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The above code output the following:

Base Constructor Called
Derived constructor called
Base Destructor called

The construction of derived object follow the construction rule but when we delete the "b" pointer(base pointer) we have found that only the base destructor is called. But this must not be happen. To do the appropriate thing, we have to make the base destructor virtual. Now let see what happens in the following:

#include <iostream>
using namespace std;
class Base
{ 
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 virtual ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The output changed as following:

Base Constructor Called
Derived Constructor called
Derived destructor called
Base destructor called

So the destruction of the base pointer(which takes an allocation on derived object!) follows the destruction rule, i.e first the Derived, then the Base. On the other hand, there is nothing like a virtual constructor.

A virtual constructor is not possible but virtual destructor is possible. Let us experiment....

#include <iostream>
using namespace std;
class Base
{
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1;Derived1();
 delete b;
}

The above code output the following:

Base Constructor Called
Derived constructor called
Base Destructor called

The construction of derived object follow the construction rule but when we delete the "b" pointer(base pointer) we have found that only the base destructor is call.But this must not be happened. To do the appropriate thing we have to make the base destructor virtual. Now let see what happen in the following:

#include <iostream>
using namespace std;
class Base
{ 
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 virtual ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new derived1;Derived1();
 delete b;
}

The output changed as following:

Base Constructor Called
Derived constructor called
Derived destructor called
Base Destructor called

So the destruction of base pointer(which take an allocation on derived object!) follow the destruction rule i.e first the derived then the base. On the other hand for constructor there are nothing like virtual constructor.

A virtual constructor is not possible but virtual destructor is possible. Let us experiment....

#include <iostream>
using namespace std;
class Base
{
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1;
 delete b;
}

The above code output the following:

Base Constructor Called
Derived constructor called
Base Destructor called

The construction of derived object follow the construction rule but when we delete the "b" pointer(base pointer) we have found that only the base destructor is call.But this must not be happened. To do the appropriate thing we have to make the base destructor virtual. Now let see what happen in the following:

#include <iostream>
using namespace std;
class Base
{ 
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 virtual ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new derived1;
 delete b;
}

The output changed as following:

Base Constructor Called
Derived constructor called
Derived destructor called
Base Destructor called

So the destruction of base pointer(which take an allocation on derived object!) follow the destruction rule i.e first the derived then the base. On the other hand for constructor there are nothing like virtual constructor.

A virtual constructor is not possible but virtual destructor is possible. Let us experiment....

#include <iostream>
using namespace std;
class Base
{
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The above code output the following:

Base Constructor Called
Derived constructor called
Base Destructor called

The construction of derived object follow the construction rule but when we delete the "b" pointer(base pointer) we have found that only the base destructor is call.But this must not be happened. To do the appropriate thing we have to make the base destructor virtual. Now let see what happen in the following:

#include <iostream>
using namespace std;
class Base
{ 
public:
 Base(){
 cout << "Base Constructor Called\n";
 }
 virtual ~Base(){
 cout << "Base Destructor called\n";
 }
};
class Derived1: public Base
{
public:
 Derived1(){
 cout << "Derived constructor called\n";
 }
 ~Derived1(){
 cout << "Derived destructor called\n";
 }
};
int main()
{
 Base *b = new Derived1();
 delete b;
}

The output changed as following:

Base Constructor Called
Derived constructor called
Derived destructor called
Base Destructor called

So the destruction of base pointer(which take an allocation on derived object!) follow the destruction rule i.e first the derived then the base. On the other hand for constructor there are nothing like virtual constructor.

added 142 characters in body
Source Link
Loading
deleted 30 characters in body
Source Link
Loading
Loading
Correct derived ctor to eliminate ambiguity - it seems like derived destructor is called twice.
Source Link
Loading
Source Link
Loading
lang-cpp

AltStyle によって変換されたページ (->オリジナル) /