Runtime Type Information

De la Wikipedia, enciclopedia liberă
Salt la: Navigare, căutare

Runtime Type Information sau Runtime Type Identification (RTTI), termen tradus în limba română ca Informație de tip la rulare, este o modalitate prin care informația despre tipul de dată al unui obiect este ținută în memorie în momentul execuției. Metoda RTTI poate fi aplicată tipurilor simple de date, cum ar fi datele de tip caracter și cele de tip întreg, sau obiectelor generice.

În cazul obiectelor, câteva implementări sunt limitate la menținerea structurii arborelui de moștenire în timp ce altele includ informații despre atributele și metodele obiectelor.

Deși se găsește în mai multe limbaje ce programare, RTTI, ca termen, este utilizat de obicei cu referire la C++. Pentru ca operația de conversie dinamică<>, operatorul sau excepțiile să funcționeze în C++, trebuie activat modul RTTI.

Exemplu în C++[modificare | modificare sursă]

/* Un pointer la o clasă de bază poate indica spre obiecte de orice clasă ce este derivată 
 * din aceasta. RTTI este folositor pentru a identifica către ce tip de obiect (care clasă derivată) indică 
 * un pointer al clasei de bază.
 */

#include <iostream>

class abc   // clasa de bază
{
public:
  virtual void salut() 
  {
    std::cout << "din abc";
  }
};

class xyz : public abc
{
  public:
  void salut() 
  {
    std::cout << "din xyz";
  }
};

int main()
{
  abc *abc_pointer = new xyz();
  xyz *xyz_pointer;

  // pentru a afla dacă abc indică spre un tip de obiect xyz
  xyz_pointer = dynamic_cast<xyz*>(abc_pointer);

  if (xyz_pointer != NULL)
    std::cout << "pointer de tip abc indicând spre un obiect de clasă xyz";   // identificat
  else
    std::cout << "pointer abc ce NU indică spre un obiect de clasă xyz";

  return 0;
}

Un caz în care este folosit RTTI este ilustrat dedesubt:


class base {
  virtual ~base(){}
};

class derived : public base {
  public:
    virtual ~derived(){}
    int compare (derived &ref);
};

int my_comparison_method_for_generic_sort (base &ref1, base &ref2)
{
  derived & d = dynamic_cast<derived &>(ref1); // rtti utilizat aici
  // RTTI dă voie procesului să să arunce o excepție de conversie
  // dacă conversia nu este încununată de succes
  return d.compare (dynamic_cast<derived &>(ref2));
}

Vezi și[modificare | modificare sursă]