Лекции (9) (Презентации лекций (PDF))
Описание файла
Файл "Лекции (9)" внутри архива находится в папке "Презентации лекций (PDF)". PDF-файл из архива "Презентации лекций (PDF)", который расположен в категории "". Всё это находится в предмете "практикум (прикладное программное обеспечение и системы программирования)" из 4 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Множественное наследованиеclass A { ... };class B { ... };class C : public A, protected B { ... };!!! Спецификатор доступа распространяется только на один базовый класс;для других базовых классов начинает действовать принцип умолчания.!!! Класс не может появляться как непосредственно базовый дважды:class C : public A, public A { ...
}; - Er.!но может быть более одного раза непрямым базовым классом:class L { public: int n; ... };class A : public L { ... };A::LСобственно АВ::Lclass B : public L { ... };class C : public A, public B { ... void f (); ... };Собственно ВСобственно СЗдесь решетка смежности такая: L <-- A <-- C --> B --> L .При этом может возникнуть неоднозначность из-за «многократного»базового класса.1О доступе к членам производного классаvoid C::f () { ... n = 5; ...} // Er.! – неясно, чье n, ноvoid С::f () { ...A::n = 5; ...} // O.K.! , либо B::n = 5;Имя класса в операции разрешения видимости (А илиВ) – это указание, в каком классе в решетке смежностиискать заданное имя.О преобразовании указателейУказатель на объект производного класса может бытьнеявно преобразован к указателю на объект базовогокласса, только если этот базовый класс являетсяоднозначным и доступным !!!2Продолжение предыдущего примера:void g ( ) {C* pc = new C;L* pl = pc;// Er.! – L не является однозначным,pl = (L*) pc;// Er.! – явное преобразование не помогает,// но возможно:pl = (L*) (А*) pc; // либо pl = (L*) (В*) pc; O.K.!Базовый класс считается доступным в некоторой области видимости,если доступны его public-члены.class B { public: int a; ...
};class D : private B { ... };void g () {D* pd = new D;B* pb = pd;// Er.! – в g() public-члены В, унаследованные// D, недоступны, такое преобразование// может осуществлять только// функция-член D, либо друзья D.}3Виртуальные базовые классы.class L { public: int n ; ... };class A : virtual public L { ... };class B : virtual public L { ... };class C : public A, public B { ... void f (); ... };Теперь решетка смежности будет такой:LАВСи теперь допустимо:void C :: f () { ... n = 5; ...} // О.К.! – n в одном экземпляреvoid g () {С* pс = new С;L* pl = pc;// O.K.! – появилась однозначность.}4Правила выбора имен в производномклассе.1 шаг:контроль однозначности (т.е. проверяется,определено ли анализируемое имя в одномбазовом классе или в нескольких); при этомконтекст не привлекается, совместноеиспользование (в одном из базовых классов)допускается.2 шаг:если однозначно определенное имя есть имяперегруженной функции, то пытаютсяразрешить анализируемый вызов (т.е.
найтиbest-maching).3 шаг:если предыдущие шаги завершились успешно,то проводится контроль доступа.5Неоднозначность из-за совпадающих имен вразличных базовых классах.class A {public:int a;void (*b) ( );void f ( );void g ( ); ...};class B {int a;void b ( );void h (char);public:void f ( );int g;void h ( );void h (int); ...};class C : public A, public B { ... };6Пример.void gg (C* pc) {}pc --> a = 1;// Er.! – A::a или B::apc --> b();// Er.! – нет однозначностиpc --> f ();// Er.! – нет однозначностиpc --> g ();// Er.! – нет однозначности,// контекст не привлекается!pc --> g = 1;// Er.! – нет однозначности,// контекст не привлекается!pc --> h ();// O.K.!pc --> h (1);// O.K.!pc --> h (‘a’);// Er.! – доступ в последнюю очередьpc --> A::a = 1;// O.K.! – т.е.
снимаем неоднозначность// с помощью операции «::»7Статические члены класса.• Статические члены-данные и члены-функции описываются в классе сквалификатором static.• Статические члены-данные существуют в одном экземпляре идоступны для всех объектов данного класса.• Статические члены класса существуют независимо от конкретныхэкземпляров класса, поэтому обращаться к ним можно еще доразмещения в памяти первого объекта этого класса, а также изменять,используя, например, имя константного объекта класса.• Необходимо предусмотреть выделение памяти под каждыйстатический член-данное класса (т.е.
описать его вне класса с возможнойинициализацией), т.к. при описании самого класса или его экземпляровпамять под статические члены-данные не выделяется.• Доступ к статическим членам класса (наряду с обычным способом)можно осуществлять через имя класса (без указания именисоответствующего экземпляра) и оператор разрешения областивидимости «::».8Пример.class A {public:static int x;static void f (char c);};int A::x; // !!! – размещение статического объекта в памятиvoid g() {…A::x = 10;…A::f ('a');…}9Особенности использования статическихметодов класса• Статических методы класса используются, восновном, для работы с глобальными объектами илистатическими полями данных соответствующегокласса.• Статические методы класса не могут пользоватьсянестатическими членами-данными класса.• Статические методы класса не могут пользоватьсяуказателем this , т.е. использовать объект, от именикоторого происходи обращение к функции.• Статические методы класса не могут бытьвиртуальными и константными (inline - могут).10.