|
Программирование >> Инициализация объектов класса, структура
typeid( re ) == typeid( manager ) en6eiil typeid( *pe ) != typeid( employee ) ложно Функция name () возвращает C-строку с именем тина, представленного объектом #include <typeinfo> int main() { employee *pe = new manager; ia+a6aa6: manager cout << typeid( *pe ).name() << endl; type info. Этой функцией можно пользоваться в программах следующим образом: Для работы с функцией-членом name() нужно включить заголовочный файл <typeinfo>. Имя типа - это единственная информация, которая гарантированно возвращается всеми реализациями C++, при этом используется функция-член name() класса type info. В начале этого раздела упоминалось, что поддержка RTTI зависит от реализации и иногда в классе type info бывают дополнительные функции-члены. Чтобы узнать, каким образом обеспечивается поддержка RTTI в вашем компиляторе, обратитесь к справочному руководству по нему. Кроме того, можно получить любую информацию, которую компилятор знает о типе, например: список функций-членов класса; способ размещения объекта в памяти, т.е. базового и производных классов. взаимное расположение подобъектов Одним из способов расширения поддержки RTTI является включение дополнительной информации в класс, производный от type info. Поскольку в классе type info есть виртуальный деструктор, то оператор dynamic cast позволяет выяснить, имеется ли некоторое конкретное расширение RTTI. Предположим, что некоторый компилятор предоставляет расширенную поддержку RTTI посредством класса extended type info, производного от type info. С помощью оператора dynamic cast программа может узнать, принадлежит ли объект типа type info, возвращенный оператором typeid, к типу extended type info. Если да, то пользоваться расширенной поддержкой RTTI разрешено. #include <typeinfo> Файл typeinfo содержит определение типа extended type info void func( employee* p ) { понижающее приведение типа type info* к extended type info* if ( eti *eti p = dynamic cast<eti *>( &typeid( *p ) ) ) dynamic cast завершается успешно, можно пользоваться информацией из extended type info через eti p else если dynamic cast завершается неудачно, можно пользоваться только стандартн type info Если dynamic cast завершается успешно, то оператор typeid вернет объект класса extended type info, т.е. компилятор обеспечивает расширенную поддержку RTTI, чем программа может воспользоваться. В противном случае допустимы только базовые средства RTTI. Упражнение 19.1 Дана иерархия классов, в которой у каждого класса есть конструктор по умолчанию и class X { ... }; class A { ... }; class B : public A { ... }; class C : public B { ... }; виртуальный деструктор: class D : public X, public C { ... }; (a) D *pd = new D; Какие из данных операторов dynamic cast завершатся неудачно? (b) A *pa = new C; A *pa = dynamic cast< A* > ( pd ); (c) B *pb = new B; C *pc = dynamic cast< C* > ( pa ); D *pd = dynamic cast< D* > ( pb ); (d) A *pa = new D; X *px = dynamic cast< X* > ( pa ); Упражнение 19.2 Объясните, когда нужно пользоваться оператором dynamic cast вместо виртуальной функции? Упражнение 19.3 Пользуясь иерархией классов из упражнения 19.1, перепишите следующий фрагмент так, чтобы в нем использовался ссылочный вариант dynamic cast для преобразования *pa в if ( D *pd = dynamic cast< D* >( pa ) ) { использовать члены D else { использовать члены A тин Ds: Упражнение 19.4 Дана иерархия классов, в которой у каждого класса есть конструктор но умолчанию и class X { ... }; class A { ... }; class B : public A { class C : public B { виртуальный деструктор: class D : public X, public C { ... }; (a) A A *pa = new D; cout << typeid ypeid( pa ).name() << endl; (b) X *px = new D; cout << typeid( *px ).name() << endl; (c) C obj; As ra = cobj; cout << typeid( sra ).name() << endl; (d) X *px = new D; As ra = *px; Какое имя типа будет напечатано в каждом из следующих случаев: cout << typeid( ra ).name() << endl;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |