Множественное наследование_C++-касты и RTTI (1115007)
Текст из файла
Множественное наследование, C++-касты и RTTIМножественное наследование,C++-касты и RTTIАлександр СмальCS центр26 марта 2015Санкт-Петербургhttp://compscicenter.ru1/22Множественное наследование, C++-касты и RTTIМножественное наследованиеМножественное наследование (multiple inheritance) —возможность наследовать сразу несколько классов.struct Student {string name ()const { return name_ ; }string university () const { return university_ ; }private :string name_ , university_ ;};struct FullTimeEmployee {string name ()const { return name_ ; }string company () const { return company_ ; }private :string name_ , company_ ;};struct BadStudent : Student , F u l l T i m e E m p l o y e e {string name () const { return Student :: name (); }};http://compscicenter.ru2/22Множественное наследование, C++-касты и RTTIИнтерфейсыstruct Person {string name () const { return name_ ; }string name_ ;};struct IStudent {virtual string name ()const = 0;virtual string university () const = 0;virtual ~ IStudent () {}};struct I Ful lTi meE mpl oye e {virtual string name ()const = 0;virtual string company () const = 0;virtual ~ IFu llT im eE m p l o y e e () {}};struct BadStudent : Person , IStudent , I F u l l T i m e E m p l o y e e {string name ()const { return Person :: name (); }string university () const { return university_ ; }string company ()const { return company_ ; }string university_ , company_ ;};http://compscicenter.ru3/22Множественное наследование, C++-касты и RTTIПереопределением одинаковых функцийstruct IStudent {virtual string name ()const = 0;virtual string university () const = 0;virtual ~ IStudent () {}};struct IPlayer {virtual string name ()const = 0;virtual ~ IPlayer () {}};struct TypicalStudent : Person , IStudent , IPlayer {...string name ()const { return Person :: name (); }...};http://compscicenter.ru4/22Множественное наследование, C++-касты и RTTIПереопределение одинаковых функцийstruct IStudent {virtual string name ()const = 0;virtual string university () const = 0;virtual ~ IStudent () {}};struct IStudentX : IStudent {string name () const { return studentName (); }virtual string studentName () const = 0;};struct IPlayer {virtual string name ()const = 0;virtual ~ IPlayer () {}};struct IPlayerX : IPlayer {string name () const { return playerName (); }virtual string playerName () const = 0;};struct TypicalStudent : Person , IStudentX , IPlayerX {string studentName () const { return Person :: name (); }string playerName () const { return " DarkEvil666 " ; }};http://compscicenter.ru5/22Множественное наследование, C++-касты и RTTIПредставление в памятиВо многих языках множественное наследование заменяетсявозможностью реализовывать интерфейсы.PersonIStudentIFullTimeEmployeeBadStudentBadStudentPersonIStudentIFullTimeEmployeeВажно: помните про преобразование указателей.http://compscicenter.ru6/22Множественное наследование, C++-касты и RTTIСоздание и удаление объектаstruct A { };struct B : A { };struct C : B { };struct D { };struct E : A , D { };struct F : C , D , E { };Порядок вызова конструкторов: A, B, C, D, A, D, E, F.Деструкторы вызываются в обратном порядке.Проблемы:1.
Дублирование A и D.2. Недоступность первого D.http://compscicenter.ru7/22Множественное наследование, C++-касты и RTTIВиртуальное наследованиеArtWorkPersonArtWorkLyricsMusicvirtualvirtualStudentEmployeeSongBadStudentstruct Person {};struct Student: virtual Person {};struct Employee : virtual Person {};struct BadStudent : Student , Employee {};http://compscicenter.ru8/22Множественное наследование, C++-касты и RTTIВиртуальное наследование: вопросыКто вызывает конструктор базового класса?struct Person {explicit Person ( string const & name ): name_ ( name ) {}string name_ ;};struct Student : virtual Person {explicit Student ( string const & name ) : Person ( name ) {}};struct Employee : virtual Person {explicit Employee ( string const & name ) : Person ( name ) {}};struct BadStudent : Student , Employee {explicit BadStudent ( string const & name ): Person ( name ) , Student ( name ) , Employee ( name ){}};http://compscicenter.ru9/22Множественное наследование, C++-касты и RTTIВиртуальное наследование: вопросыКак устроено расположение в памяти?PersonStudentvirtualvirtualStudentEmployeeBadStudentEmployeePerson StudentPerson EmployeeBadStudentPerson Student EmployeeBadStudentStudent Person Employeehttp://compscicenter.ru10/22Множественное наследование, C++-касты и RTTIВиртуальное наследование: вопросыКак устроено расположение в памяти?PersonStudentvirtualvirtualStudentEmployeeBadStudentEmployeePerson StudentPerson EmployeeBadStudentPerson Student EmployeeBadStudentStudent Person EmployeeНа самом деле как-то так.BadStudent Student Employee Personhttp://compscicenter.ru10/22Множественное наследование, C++-касты и RTTIВиртуальное наследование: вопросыДоступ через таблицу виртуальных методовstruct Person {string name ;};struct Student: virtual Person { };struct Employee : virtual Person { };struct BadStudent : Student , Employee { };int main {BadStudent bs ;string name = bs .
name ;// на самом делеstring name = bs . __getPerson () - > name ;}http://compscicenter.ru11/22Множественное наследование, C++-касты и RTTIЗаключение1. Не используйте множественное наследование длянаследования реализации.2. Используйте интерфейсы.3. Хорошо подумайте перед тем, как использоватьвиртуальное наследование.4. Помните о неприятностях, связанных с множественнымнаследованием.5.
Помните о неприятностях, связанных с виртуальнымнаследование.http://compscicenter.ru12/22Множественное наследование, C++-касты и RTTIC-style castСтандартный способ приведения типов в C.int a = 10;int b = 3;double d = (( double ) a ) / b + 3.5;d = int ( d );double * m = ( double *) malloc ( sizeof ( double ) * 100);m [0] = 10.5;char * mc = ( char *) m ;mc [4] = 23;В C преобразует арифметические типы и указатели.Что делает в C++?http://compscicenter.ru13/22Множественное наследование, C++-касты и RTTIПреобразования в C++: static_castСлужит для преобразований связанных типов:∙ Стандартные преобразования.double d = static_cast < double >(10) / 3 + 3.5;d = static_cast < int >( d );∙ Явное (пользовательское) приведение типа:T t = static_cast <T >( e ); // T t(e);∙ Обратные варианты стандартных преобразований:∙ целочисленные типы в перечисляемые,∙ Base * в Derived * (downcast),∙ T Base:: * в T Derived:: *,∙ void * в любой T *∙ Преобразование к void.static_cast < void >(5);http://compscicenter.ru14/22Множественное наследование, C++-касты и RTTIПреобразования в C++: const_castСлужит для снятия/добавления константности:void f ( double const & d ) {const_cast < double & >( d ) = 10;}Использование const_cast — признак плохого дизайна.http://compscicenter.ru15/22Множественное наследование, C++-касты и RTTIПреобразования в C++: const_castСлужит для снятия/добавления константности:void f ( double const & d ) {const_cast < double & >( d ) = 10;}Использование const_cast — признак плохого дизайна.Кроме некоторых исключений:T & operator []( size_t i ) {returnconst_cast < T & >(const_cast < Vector const & >(* this )[ i ]);}T const & operator []( size_t i ) const {assert ( i < size_ );return data_ [ i ]}http://compscicenter.ru15/22Множественное наследование, C++-касты и RTTIПреобразования в C++: reinterpret_castСлужит для преобразований несвязанных указателей.void send ( char const * data , size_t length );char * recv ( size_t * length );double * m = static_cast < double * >( malloc ( sizeof ( double ) * 100));...char * mc = reinterpret_cast < char * >( m );send ( mc , sizeof ( double ) * 100);// other sidesize_t l = 0;double * r = reinterpret_cast < double * >( recv (& l ));l /= sizeof ( double );http://compscicenter.ru16/22Множественное наследование, C++-касты и RTTIГраницы применимости C-style castC-style cast может вызвать любое из преобразований:static_cast, reinterpret_cast, const_cast.Можно использовать:∙ преобразование встроенных типов,∙ преобразование указателей на явные типы.Не стоит использовать:∙ в шаблонах,∙ для преобразования пользовательских типов и указателейна них.http://compscicenter.ru17/22Множественное наследование, C++-касты и RTTIКогда C-style cast приводит к ошибкеstruct A ;struct B ;struct C ;C * f(B * b) {return ( C *) b ;// reinterpret_cast// return static_cast<C *>(b); doesn’t compile}struct A {int a ;};struct B {};struct C : A , B{};http://compscicenter.ru18/22Множественное наследование, C++-касты и RTTIRun-time type informationВ C++ есть механизм получения информации о типах временивыполнения.Состоит из двух компонент:1.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.