Виртуальные функции. Абстрактные классы
4.1. 1. Имеется иерархия классов, хотя бы из двух классов – базового и производного. 2. В базовом классе функция объявлена с ключевым словом virtual. 3. В производном классе есть функция с таким же именем, с таким же списком параметров (количество, типы и порядок параметров совпадают) и с таким же типом возвращаемого значения. 4. Вызов функции производного класса осуществляется через указатель на объект базового класса (или с помощью ссылки на объект базового класса) без указания самого объекта и уточнения с помощью операции разрешения области видимости.
class B { public: virtual void print (); }; class P: public B { public: void print (); }; void B::print () {... } void P::print () {... }
B * ps = new P;... ps -> print (); 4.2. int main(){ X a; Z b; X * p = &b; p -> g(1.5); // печатается Z::t // Z::h // Z::g p -> h(); //печатается X::t // X::h p -> t(5); // ошибка, X::t – без параметров }
4.3. int main(){ T t; S s; T *p = &s;
p -> f (1.5); // печатается T::f p -> g (); // печатается T::f // T::g p -> h(); //печатается S::f // S::g // S::h }
4.4. int main(){ K k; P p; K *t = &p;
t -> f (0.7); // печатается K::f t -> g (); // печатается K::f // K::g t -> h(); //печатается P::f // P::g // P::h }
4.5. Ошибочным является вызов p -> h() (нет функции h() без параметров). Будет выдано в поток: B::h,2 B::f,2 B::h,0 A::g B::h,3
4.6. Ошибок нет. Будет выдано в поток: D::h D::h,2 D::f,2 D::h D::h,1 D::g D::h D::h D::h,3 4.7. Ошибочным является вызов p -> h(2) (Функция h(int) из производного класса не замещает h() базового класса, так как имеет отличающийся набор параметров). Будет выдано в поток: U::h,1 U::f,1 T::h T::g T::h
4.8. first third result = (113; 2) fourth second
4.9. mercury earth result = (-62; 11) mars venus
4.10. dog sheep result = (33; 4) horse cat
4.11. При передаче переменной типа А в функцию g по значению должен быть создан объект типа А, а это невозможно, поскольку структура содержит чистую виртуальную функцию.
4.12. Полем структуры А является объект типа S, а это невозможно, поскольку структура S содержит чистую виртуальную функцию.
4.13. При передаче переменной типа B в функцию g по значению должен быть создан объект типа B, а это невозможно, поскольку структура содержит чистую виртуальную функцию. 4.14. f (int) from B
10 10 10 10
4.15. add_st (K*) from K
5 5 5
4.16. g () from T
7 7 7
Аппарат исключений 5.1. Будет напечатано: 5.2. Будет напечатано: 5.3. Будет напечатано: 5.4. 4 11 10 12 2 5 4 11 10 12 5 13 5 5.5. 9 1 4 11 10 12 5 13 5 5.6. 4 11 9 12 2 5 10 6 8 5 14 5.7. cat elephant 91 5.8. lance arche 61 5.9. plane boat 52 5.10. l a d e m e 5.11. d b e d e m e 5.12. l a l f i k e n 5.13. Copy SCatchS& Destr SConstr Destr MainCatch... 5.14. SConstr Copy SCatchS& Destr SConstr Main Destr Destr 5.15. SCatch_int SConstr Copy SCatchS& Destr MainCatchS& Destr Константные и статические члены класса. 6.1. Исправления: class A { public: static int y; void f() const {cout << "f" << endl;} }; 6.2. Исправления:
class X { public: static void g () {cout << "g" << endl;} int f(int n) const {cout << "f" << endl; return n;} }; A) 1. Заменить слово “class” словом “struct”, либо вставить после открывающей фигурной скобки определения класса слово “public:”. 2. Cделать метод “g()” статическим. b) 1. Заменить слово “class” словом “struct”, либо вставить после открывающей фигурной скобки определения класса слово “public:”. 2. В определениях методов “f()” и “g()” вставить после пустого списка формальных параметров слово “const”. c) 1. Заменить слово “class” словом “struct”, либо вставить после открывающей фигурной скобки определения класса слово “public:”. 2. В определении метода “g()” вставить перед типом формального параметра слово “const”. 3. В определении метода “g()” вставить после списка формальных параметров слово “const”. A) class A { public: static int x; void get_0() const { return;} }; b) class A { public: static const char a; static void f(){} }; c)
class A { public: static void g(){} void h() const {} }; 6.5. Ошибочными являются указания на то, что статические методы f() вызывают нестатические методы. Надо исключить в методах f() вызовы методов h(): На печать будет выдано: B::f,0 A::f,1 A::g A::g A::h,2 A::f,3 6.6. 1) Чтобы функцию f () можно было вызывать для констант (t -> f(3)), надо поставить модификатор const после списка формальных параметров этой функции в классе C. 2) Чтобы из функции C::f() можно было вызвать функцию C::h(), надо поставить модификатор const после списка формальных параметров функции C::h(). 3) Чтобы функцию преобразования operator int() можно было вызывать для констант (t -> f (d)), надо поставить модификатор const после списка формальных параметров этой функции в классе D. 4) Чтобы функцию g () можно было вызывать для констант (t -> g ()), надо поставить модификатор const после списка формальных параметров этой функции в классе C. При таких исправлениях все функции станут невиртуальными, и будет выдано в поток: C::f,3 C::h,3 C::f,100 C::h,100 C::g C::h,5
Если будут сделаны синхронные исправления описания функций f(), g() и h(), в классе D, чтобы функции остались виртуальными, будет выдано в поток:
D::f,3 D::h,3 D::f,100 D::h,100 C::g D::h,5 6.7. a) class A { int i; public: A(int x) { i = x; } A(const A & y) { i = y.i; } const A f(const A & z) const { cout << i << endl; } }; b) class A { int i; public: A(int x) { i = x; } A(const A & y) { i = y.i; } const A f(const A & c) const { cout << c.i << endl; } }; c) class A { int i; public: A(int x) { i = x; } A(const A & y) { i = y.i; } const A f(const A c) const { cout << c.i << endl; } }; 6.8. a) 1. Заменить слово “class” словом “struct”. 2. Перед определением типа поля “i” вставить слово “static”. 3. В определениях методов “f()” и “g()” вставить после пустого списка формальных параметров слово “const”. 4. В определениях методов “f()” и “g()” вставить перед типом формального параметра слово “const”. b) 1. Заменить слово “class” словом “struct”. 2. Перед определением типа поля “y” вставить слово “static”. 3. В определениях методов “p()” и “q()” перед типом возвращаемого значения вставить слово “static”. 4. В определении метода “q()” удалить слово “const”. c) 1. Заменить слово “class” словом “struct”. 2. Перед определением типа поля “m” вставить слово “static”. 3. В определениях методов “m1()”, “m2()” и “m3()” перед типом возвращаемого значения вставить слово “static”. 4. В определении метода “m2()” удалить слово “const”.
5. В определениях методов “m2()” и “m3()” вставить перед типом формального параметра слово “const”.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|