During construction and destruction of an object, its final type may be different from that of the completely constructed object. The result of using an object’s dynamic type in a constructor or destructor may not be consistent with developer expectations.

The dynamic type of an object is used in the following constructs:

* ``++typeid++`` on a class with a virtual function or a virtual function in a base class.
* ``++dynamic_cast++``
* A virtual call to a virtual function.

This rule also prohibits a call being made to a pure virtual function from within a constructor or destructor. Such calls lead to undefined behaviour.


== Noncompliant Code Example

----
class B1
{
public:
  B1 ( )
  {
   typeid ( B1 ); // Compliant, B1 not polymorphic
  }
};
class B2
{
public:
  virtual ~B2 ( );
  virtual void foo ( );
  B2 ( )
  {
    typeid ( B2 ); // Noncompliant
    B2::foo ( ); // Compliant, not a virtual call
    foo ( ); // Noncompliant
    dynamic_cast< B2* > ( this ); // Noncompliant
  }
};
----


== See

* MISRA {cpp}:2008, 12-1-1 - An object's dynamic type shall not be used from the body of its constructor or destructor.


ifdef::env-github,rspecator-view[]
'''
== Comments And Links
(visible only on this page)

include::comments-and-links.adoc[]
endif::env-github,rspecator-view[]
