Означает ли RTTI динамическую привязку?

В С++ означает ли динамическая привязка информация о типе времени выполнения (RTTI)?


person Josh Morrison    schedule 21.02.2011    source источник
comment
en.wikipedia.org/wiki/RTTI   -  person Thomas Edleson    schedule 21.02.2011
comment
en.wikipedia.org/wiki/Dynamic_binding_(computer_science)   -  person Thomas Edleson    schedule 21.02.2011


Ответы (3)


RTTI означает, что в вывод компилятора включается дополнительная информация, чтобы код среды выполнения мог знать подробности о классах и типах исходного кода, которые обычно выбрасываются при компиляции.

Например, машинному коду не нужно знать имя функции, чтобы вызвать функцию — для вызова функции в машинном коде нужно знать только адрес целевой функции.

Другой пример: скомпилированному машинному коду не нужно знать имя типа класса во время выполнения. Но если вы хотите создать библиотеку автоматической сериализации, вам, вероятно, потребуется знать текстовое имя каждого класса, чтобы вы могли записать его в выходной поток. Имя класса — RTTI.

Если под динамической привязкой вы подразумеваете возможность находить и вызывать методы или свойства по строковому имени во время выполнения, которые не были известны во время компиляции, то да, RTTI — это ресурс, который можно использовать для этой цели.

person dthorpe    schedule 21.02.2011

RTTI означает определение динамического типа ссылки (или указателя) во время выполнения:

class Base {};
class Dervied : public Base {};

Base* b ; // Static type of pointer is Base*;
b = new Base(); // Dynamic type (pointed to) is Base;
b = new Derived()' // Dynaic type pointed to is Derived.

RTTI выясняет, на что на самом деле указывает тип b, то есть на динамический тип b.

RTTI дорого стоит и это дурной тон.

При публичном наследовании Derived является Base, поэтому функция не должна заботиться о динамическом типе; все, что он может сделать с чем-либо, на что указывает b, должно быть в порядке, указывает ли b на Base или на Derived.

Если вашей функции необходимо знать динамический тип, предполагается, что вы делаете что-то внешнее по отношению к Base, что должно быть инкапсулировано в base, как метод, который вы можете вызывать в Base.

Если вам действительно нужно сделать что-то внешнее (и вы не можете сделать это, скажем, с посетителем, потому что внешняя вещь мультидиспетчерская), то, по крайней мере, инкапсулируйте (выступающий) paet RTTI. Скажем, важно то, является ли это Базой или нет:

class Base { 
  virtual bool isBase() { return true; } 
};

class Dervied : public Base {
  virtual bool isBase() { return false; }
}

Если важен тип, сделайте что-то вроде этого:

class Base { 
  virtual string typeName { return "Base"; } 
};

class Dervied : public Base {
  virtual string typeName { return "Derived"; }
}

Естественно, поскольку я добавил виртуальную функцию, мне нужно добавить виртуальный dtor, что означает (Правило трех) я должен также добавить ctor копирования и оператор присваивания копирования. Они не показаны.

person tpdi    schedule 21.02.2011
comment
Плохой тон? Это суровый приговор. - person Jörgen Sigvardsson; 22.02.2011

Нет. Динамическое связывание — довольно расплывчатый термин, относящийся к идее принятия во время выполнения решения о том, какую из набора функций вызывать, исходя из некоторого контекста. Обычно это определяется фактическим типом объекта через указатель на базовый класс, который обычно называют виртуальными функциями-членами.

RTTI — это механизм обнаружения объекта type_info для объекта во время выполнения. Хотя эти два понятия в некоторой степени связаны между собой, они, тем не менее, весьма различны друг от друга.

person Marcelo Cantos    schedule 21.02.2011