Укажите особенности использования указателей базового класса для производного класса
Неизвестно куда указывает указатель – на базовый класс или на производный. Чтобы узнать, на какой указывает, есть куча способов. Но их за 5 минут не расскажешь. Если указатель указывает на производный класс, а не на базовый и в этих классах есть виртуальный метод, то при вызове его для указателя вызовется именно тот, который описан в производном классе.
113. Зачем виртуализируются методы класса? При использовании наследования, возникает ситуация, когда нужно использовать указатель базового класса для элементов производного класса. В этом случае, если одна функция будет иметь одну реализацию в базовом классе, и совершенно другую в производном, в зависимости, является ли она виртуальной, результаты будут различные. Если необходимо, чтобы при вызове этой функции у данного указателя выполнялась реализация из производного класса, тогда эта функция должна быть виртуальной. Иначе, будет выполняться реализация из базового класса. Пример: class Base { public: virtual void show() //виртуальная функция { cout << “Base\n”; } }; class Derv1: public Base // Производный класс 1 { public: void show() { cout << “Derv1\n”; } }; class Derv2: public Base // Производный класс 2 { public: void show() { cout << “Derv2\n”; } }; int main() { Derv1 dv1; // Объект производного класса 1 Derv2 dv2; // Объект производного класса 2 Base* ptr; // Указатель на базовый класс ptr = &dv1; //Адрес dv1 занести в указатель ptr -> show() // Выполнить show() ptr = &dv2; //Адрес dv2 занести в указатель ptr -> show()// Выполнить show() return 0; } Итог программы: Derv1 Derv2 Следовательно, выполняются методы производных классов, а не базового.
114. Определите понятие «абстрактный класс». Определите понятие «чистый виртуальный метод». Абстрактный класс – это базовый класс, объекты которого никогда не будут реализованы. Такой класс может существовать с единственной целью – быть родительским по отношению к производным классам, объекты которых будут реализованы. Некоторые классы представляют собой абстрактную концепцию, для них создание объекта было бы бессмысленно. Например, класс фигура. От этого класса можно понаследовать классы круг, квадрат, но сам класс фигура называется абстрактным и для него бессмысленно создавать объекты. Такие классы содержат виртуальные функции, которые замещаются в потомках. Если объявить функцию вот так: virtual void Show() = 0; то это будет чисто виртуальная функция. Если класс содерижт хотя бы одну такую чисто виртуальную функцию, то компилятор считает такой класс абстрактным и запрещает создание объекта такого класса. 115. Опишите понятие «множественное наследование». Какие проблемы возникают при множествен-ном наследовании? Множетсвенно наследование – это когда класс может быть производным не только от одного базового класса, а и от многих. Пример: class A{}; class B {}; class C: public A, public B {}; Проблемы: (стр.397) 1) У обоих предков могут оказаться одинаковые имена 2) Если предки класса сами являются потомками одного класса, то может возникнуть неоднозначность
|