== Why is this an issue?

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

[source,cpp]
----
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
  }
};
----


== Resources

* 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[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Remove this [use of "typeid"|use of "dynamic_cast"|virtual call to method "xxx"]


'''
== Comments And Links
(visible only on this page)

=== on 14 Oct 2014, 18:11:13 Ann Campbell wrote:
\[~samuel.mercier] please correct the following

* Code should be quoted in the message. Also, I don't quite understand the use of "::" here.
* Add a See section to the description listing the appropriate MISRA number
* Fill in Applicability.
* Make sure the appropriate MISRA C and MISRA {cpp} fields on the references tab are filled in
* Please use the standard headings, e.g. Noncompliant Code Example instead of just Example

In addition, please consider clarifying the following:

* "final type" during construction vs the type of "the completely constructed object" 
* the Noncompliant Code Example tells us in a comment that B2 is derived, but B2 doesn't actually seem to extend anything. 

=== on 17 Oct 2014, 09:00:51 Samuel Mercier wrote:
\[~ann.campbell.2] updated.

* "final type" during construction vs the type of "the completely constructed object" : this is a copy-paste of the MISRA document, so I suspect it is meaningful and correct in the {cpp} context.
* ... but B2 doesn't actually seem to extend anything : that's correct. This example says that, if B2 is extended, then during the call of constructor B2 the dynamic type is not clearly defined.

endif::env-github,rspecator-view[]
