Виртуальные функции. Абстрактные классы
4.1. Описать условия включения механизма виртуальности для метода класса. Привести пример записи виртуальной функции и обращения к ней. 4.2. Есть ли ошибки в приведенном фрагменте программы? Если есть, то объясните, в чем они заключаются. Ошибочные конструкции вычеркнуть из текста программы. Что будет выдано в стандартный канал вывода при работе программы?
class X { public: virtual int g (double x) { h (); cout << "X::g" << endl; return 1; } void h () { t (); cout << "X::h" << endl;} virtual void t () { cout << "X::t" << endl;} }; class Z: public X { public: int g (double y) { h (); cout << "Z::g" << endl; return 3; } virtual void h () { t (1); cout << "Z::h" << endl; } virtual void t (int k) { cout << "Z::t" << endl; } };
int main(){ X a; Z b; X * p = &b; p -> g(1.5); p -> h(); p -> t(5); } 4.3. Есть ли ошибки в приведенном фрагменте программы? Если есть, то объясните, в чем они заключаются. Ошибочные конструкции вычеркнуть из текста программы. Что будет выдано в стандартный канал вывода при работе программы? class T { public: virtual int f (int x) { cout << "T::f" << endl; return 0; } void g () { f (1); cout << "T::g" << endl; } virtual void h () { g (); cout << "T::h" << endl; } };
class S: public T { public: int f (double y){ cout << "S::f" << endl; return 2; } virtual void g () { f (1); cout << "S::g" << endl; } virtual void h () { g(); cout << "S::h" << endl; } }; int main (){ T t; S s; T *p = &s; p -> f (1.5); p -> g (); p -> h (); }
4.4. Есть ли ошибки в приведенном фрагменте программы? Если есть, то объясните, в чем они заключаются. Ошибочные конструкции вычеркнуть из текста программы. Что будет выдано в стандартный канал вывода при работе программы?
class K { public: virtual int f (int x) { cout << "K::f" << endl; return 0; } void g () { f (1); cout << "K::g" << endl;
} virtual void h () { g (); cout << "K::h" << endl; } }; class P: public K { public: int f (double y) { cout << "P::f" << endl; return 2; } virtual void g () { f (1); cout << "P::g" << endl; } virtual void h () { g(); cout << "P::h" << endl; } };
int main(){ K k; P p; K *t = &p; t -> f (0.7); t -> g (); t -> h (); }
4.5. Есть ли ошибки в приведенном фрагменте программы? Если есть, то объясните, в чем они заключаются. Ошибочные конструкции вычеркнуть из текста программы. Что будет выдано в стандартный поток вывода при работе программы?
class A { public: virtual void f (int x) { h (x); cout << "A::f," << x << endl; }
void g () { h (0); cout << "A::g" << endl; } virtual void h (int k) { cout << "A::h," << k << endl; } };
class B: virtual public A { public: void f (int y) { h (y); cout << "B::f," << y << endl; } void g () { h (1); cout << "B::g" << endl; } void h (int k) { cout << "B::h," << k << endl; } };
int main(){ A a; B b; A * p = & b; p -> f (2); p -> g (); p -> h (); p -> h (3); } 4.6. Есть ли ошибки в приведенном фрагменте программы? Если есть, то объясните, в чем они заключаются. Ошибочные конструкции вычеркнуть из текста программы. Что будет выдано в стандартный поток вывода при работе программы?
class C { public: virtual void f (int x) { h (x); cout << "C::f," << x << endl; }
virtual void g () { h (0); cout << "C::g" << endl; } virtual void h () { cout << "C::h" << endl; } virtual void h (int k) { h (); cout << "C::h," << k << endl; } };
class D: public C { public: virtual void f (int y) { h (y); cout << "D::f," << y << endl; } virtual void g () { h (1); cout << "D::g" << endl; }
virtual void h () { cout << "D::h" << endl; } virtual void h (int k) { h (); cout << "D::h," << k << endl; } };
int main(){ C c; D d; C * p = & d; p -> f (2); p -> g (); p -> h (); p -> h (3); }
4.7. Есть ли ошибки в приведенном фрагменте программы? Если есть, то объясните, в чем они заключаются. Ошибочные конструкции вычеркнуть из текста программы. Что будет выдано в стандартный поток вывода при работе программы?
class T { public: virtual void f (int x) { h (); cout << "T::f," << x << endl; } void g () { h (); cout << "T::g" << endl; } virtual void h () { cout << "T::h" << endl; } };
class U: virtual public T { public: void f (int y) { h (y); cout << "U::f," << y << endl; } virtual void g () { h (0); cout << "U::g" << endl; }
void h (int k) { cout << "U::h," << k << endl; } }; int main(){ T t; U u; T * p = & u; p -> f (1); p -> g (); p -> h (); p -> h (2); }
4.8. Что напечатает следующая программа?
class A { int i; public: A(int x) { i = x; cout << "first" << endl; } virtual ~A() { cout << "second" << endl; } int f() const { return i + g() + h(); } virtual int g() const { return i; } int h() const { return 39; } };
class B: public A { public: B(): A(70) { cout <<"third" << endl; } ~B() { cout << "fourth" << endl; } int f() const { return g() - 2; } virtual int g() const { return 4; } int h() const { return 6; } };
int main() { B b; A* p = &b; Cout << "result = (“ << p->f() <<’;’<< b.f() << ’)’ << endl; return 0; }
4.9. Что напечатает следующая программа?
class A { int i; public: A(int x) { i = x; cout << "mercury" << endl; } virtual ~A() { cout << "venus" << endl; } int f() const { return 96; } virtual int g() const { return i; } int h() const { return i - f() - g(); } };
class B: public A { public: B(int x): A(x+20) { cout << "earth" << endl; } ~B() { cout << "mars" << endl; } int f() const { return 8; } virtual int g() const { return 3; } int h() const { return f() + g(); } };
int main() { B b(17); A* p = &b; Cout << "result = (" << p->h() << ’;’<< b.h() <<’)’ << endl; return 0; }
4.10. Что напечатает следующая программа?
class A { int i; public: A(int x) { i = x; cout << "dog" << endl; } virtual ~A() { cout << "cat" << endl; } int f() const { return i + g() + h(); } virtual int g() const { return i; } int h() const { return 5; } };
class B: public A { public: B(): A(21) { cout << "sheep" << endl; } ~B() { cout << "horse" << endl; } int f() const { return g() - 3; } virtual int g() const { return 7; } int h() const { return 9; } };
int main() { B b; A* p = &b; Cout << "result = (" << p->f() << ’;’ << b.f() <<’)’ << endl; return 0; }
4.11. Дан фрагмент программы:
struct A { int i; virtual void f() = 0; virtual ~A() {} };
int g(A a) { return a.i * 5; }
Есть ли в этом фрагменте ошибки? Если да, то в чем они заключаются?
4.12. Дан фрагмент программы:
struct S { virtual void f() const = 0; virtual ~S() {} };
struct A { S s; int i; };
Есть ли в этом фрагменте ошибки? Если да, то в чем они заключаются?
4.13. Дан фрагмент программы:
class B { public: virtual int f() = 0;
int g() { return f() * 10; } virtual ~B() {} }; int h(B b) { return b.g() + 2; }
Есть ли в этом фрагменте ошибки? Если да, то в чем они заключаются?
4.14. Что напечатает следующая программа?
struct B { virtual void f (int n) { cout << “f (int) from B” << endl; } static int i; };
struct D: B { virtual void f (char n) { cout << “f (char) from D” << endl; } };
int B::i = 1;
int main () { D d; B b1, b2, *pb = &d; pb -> f (‘a’); b1.i += 2; b2.i += 3; d.i += 4; cout << b1.i << ‘ ‘ << b2.i << ’ ‘ << d.i << ‘ ‘ << B::i << endl; return 0; }
4.15. Что напечатает следующая программа?
struct K { virtual void add_st (K * n) { st ++; cout << “add_st (K*) from K” << endl; } static int st; };
struct L: K { virtual void add_st (L * a) { st++; cout << “add_st (L*) from L” << endl; } };
int K::st = 2; int main () { L ob, ob2; K k, *pl = &ob; pl -> add_st (& ob2); k.st ++; ++ob.st; cout << k.st << ’ ‘ << ob.st << ‘ ‘ << K::st << endl; return 0; }
4.16. Что напечатает следующая программа?
struct S { static double d; virtual S & g () { cout << “g () from S” << endl; } }; struct T: S { virtual T & g () { cout << “g () from T” << endl; }
};
double S::d = 1.5; int main () { T t; S s, *ps = &t; ps -> g (); s.d = 5; t.d = 7; cout << s.d << ’ ‘ << t.d << ‘ ‘ << S::d << endl; return 0; }
Аппарат исключений 5.1. Что будет выдано в стандартный канал вывода при работе следующей программы?
class X; void F(X & x, int n); class X { public: X() { try { F(* this, -2); cout << 1 << endl; } catch (X) { cout << 2 << endl; } catch (int) { cout << 3 << endl; } } X(X &) { cout << 12 << endl; } };
class Y: public X { public: Y () {cout << 4 << endl;} Y (Y & a) {cout << 5 << endl;} ~Y () {cout << 6 << endl;} };
void F(X & x, int n) { try { if (n < 0) throw x; if (n > 10) throw 1; cout << 7 << endl; } catch (int) { cout << 8 << endl; } catch (X&) { cout << 9 << endl; throw; } }
int main() { try { Y a; } catch (...) { cout << 10 << endl; } cout << 11 << endl; } 5.2. Что будет выдано в стандартный канал вывода при работе следующей программы? class A { public: A () { cout << 1 << endl;} }; class B: public A { public: B (int n) { try { if (n == 0) throw * this; if (n > 11) throw 11; } catch (int) { cout << 2 << endl; } catch (B&) { cout << 3 << endl; throw; } cout << 4 << endl; } B (B&) {cout << 5 << endl;} ~B () {cout << 6 << endl;} };
int main() { try { B b(0); B c (3); } catch (...) { cout << 7 << endl; } cout << 8 << endl;
} 5.3. Что будет выдано в стандартный канал вывода при работе следующей программы?
class X; void F(X & x, int n); class X { public: X() { try { F(*this, -2); cout << 1 << endl; } catch (X){ cout << 2 << endl; } catch (int) { cout << 3 << endl; } } X (X &) { cout << 12 << endl; } };
class Y: public X { public: Y () {cout << 4 << endl;} Y (Y & a) {cout << 5 << endl;} ~Y () {cout << 6 << endl;} };
void F(X & x, int n) { try { if (n < 0) throw x; if (n > 10) throw 1; cout << 7 << endl; } catch (int) { cout << 8 << endl; } catch (X&) { cout << 9 << endl; throw; } }
int main() { try { Y a; } catch (...) { cout << 10 << endl; } cout << 11 << endl; }
5.4. Что будет выдано в стандартный канал вывода при работе следующей программы?
struct X; void f(X & x, int n); int const P = 1; int const Q = 1; int const R = 1; struct X { X() { try { f(* this, -1); cout << 1 << endl; } catch (X) { cout << 2 << endl; } catch (int) { cout << 3 << endl; } } X (X &) { cout << 4 << endl; } ~X () { cout << 5 << endl; } };
struct Y: X { Y () { f(* this, -1); cout << 6 << endl; } Y (Y &) { cout << 7 << endl; } ~Y () { cout << 8 << endl; } };
void f(X & x, int n) { try { if (n < 0) throw x; if (n > 0) throw 1; cout << 9 << endl; } catch (int) { cout << 10 << endl; } catch (X& a) { cout << 11 << endl; f(a, 1); cout << 12 << endl; throw; } }
int main() { try { Y a; } catch (...) { cout << 13 << endl; return 0; } cout << 14 << endl; return 0; }
5.5. Что будет выдано в стандартный канал вывода при работе следующей программы? struct X; void f(X & x, int n); int const P = 1; int const Q = 1; int const R = 1; struct X { X(){ try { f(* this, 0); cout << 1 << endl; } catch (X) { cout << 2 << endl; } catch (int) { cout << 3 << endl; } } X (X &) { cout << 4 << endl; } ~X () { cout << 5 << endl; } }; struct Y: X { Y () { f(* this, -1); cout << 6 << endl; } Y (Y &) { cout << 7 << endl; } ~Y () { cout << 8 << endl; } }; void f(X & x, int n) { try { if (n < 0) throw x; if (n > 0) throw 1; cout << 9 << endl; } catch (int) { cout << 10 << endl; } catch (X& a) { cout << 11 << endl; f(a, 1); cout << 12 << endl; throw; } }
int main() { try { Y a; } catch (...) { cout << 13 << endl; return 0; } cout << 14 << endl; return 0; }
5.6. Что будет выдано в стандартный канал вывода при работе следующей программы?
struct X; void f(X & x, int n); int const P = 1; int const Q = 1; int const R = 1; struct X { X(){ try { f(*this, -1); cout << 1 << endl; } catch (X) { cout << 2 << endl; } catch (int) { cout << 3 << endl; } } X (X &) { cout << 4 << endl; } ~X () { cout << 5 << endl; } };
struct Y: X { Y () { f(* this, 1); cout << 6 << endl; } Y (Y &) { cout << 7 << endl; } ~Y () { cout << 8 << endl; } };
void f(X & x, int n) { try { if (n < 0) throw x; if (n > 0) throw 1; cout << 9 << endl; } catch (int) { cout << 10 << endl; } catch (X& a) { cout << 11 << endl; f(a, 0); cout << 12 << endl; throw; } }
int main() { try { Y a; } catch (...) { cout << 13 << endl; return 0; } cout << 14 << endl; return 0; } 5.7. Что напечатает слудующая программа?
class Ex { int code; public: Ex(int i): code(i) {} Ex(const Ex& ex): code(ex.code) {} int Get() const { return code; }
};
struct Ex90: Ex { Ex90(): Ex(90) {} };
void f() { throw Ex90(); cout << "dog" << endl; }
void t() { try { f(); } catch (Ex90 &x) { cout<< "cat” << endl; throw Ex(x.Get() + 1); cout << "sheep" << endl; } catch (Ex &) { cout << "horse" << endl; } cout <<"cow" << endl; }
int main() { try { t(); } catch (Ex &x) { cout << "elephant " << x.Get() << endl; } catch (...) { cout << "wolf" << endl; } return 0; }
5.8. Что напечатает следующая программа?
class Ex { int code; public: Ex(int i): code(i) {} Ex(const Ex& ex): code(ex.code) {} int Get() const { return code; } };
struct Ex60: Ex { Ex60(): Ex(60) {} };
void f() { throw Ex60(); cout << "sword" << endl; }
void t() { try { f(); } catch (Ex60 &x) { cout << "lance" << endl; throw Ex(x.Get() + 1); cout << "dagger" << endl; } catch (Ex &) { cout << "knife" << endl; } cout << "hammer" << endl; }
int main() { try { t(); } catch (Ex &x) { cout << "arche " << x.Get() << endl; } catch (...) { cout << "pistole" << endl; } return 0; }
5.9. Что напечатает следующая программа?
class Ex { int code; public: Ex(int i): code(i) {} Ex(const Ex& ex): code(ex.code) {} int Get() const { return code; } };
struct Ex51: Ex { Ex51(): Ex(51) {} };
void f() { throw Ex51(); cout << "train" << endl; }
void t() { try { f(); } catch (Ex51 &x) { cout << "plane" << endl; throw Ex(x.Get() + 1); cout << "helicopter" << endl; } catch (Ex &) { cout << "car" << endl; } cout << "truck" << endl; }
int main() { try { t(); } catch (Ex &x) { cout << "boat " << endl << x.Get() << endl; } catch (...) { cout << "rocket" << endl; } return 0; }
5.10. Что будет выдано в стандартный поток вывода при работе следующей программы? void f(X & x, int n); struct X { X () { try { f(*this, -1); cout << "a"; } catch (X){ cout << "b"; } catch (int){ cout << "c"; } } X (X &) { cout << "d"; } virtual ~X () { cout << "e"; } };
struct Y: X { Y () { try { f(* this, 0); cout << "f"; } catch (Y) { cout << "g"; } catch (int){ cout << "h"; } cout << "i"; } Y (Y &){ cout << "j"; } ~Y (){ cout << "k"; } }; void f(X & x, int n) { try { if (n < 0) throw -n; else if (n == 0) throw x; else throw n;} catch (int){ cout << "l"; } }
int main() { try { Y a; } catch (...){ cout << "m"; return 1; } cout << "n"; return 0; } 5.11. Что будет выдано в стандартный поток вывода при работе следующей программы?
void f(X & x, int n); struct X { X () { try { f(*this, 0); cout << "a"; } catch (X){ cout << "b"; } catch (int){ cout << "c"; } } X (X &) { cout << "d"; } virtual ~X () { cout << "e"; } };
struct Y: X { Y () { try { f (*this, 0); cout << "f"; } catch (Y) { cout << "g"; } catch (int) { cout << "h"; } cout << "i"; } Y (Y &) { cout << "j"; } ~Y () { cout << "k"; } };
void f(X & x, int n) { try { if (n < 0) throw -n; else if (n == 0) throw x; else throw n; } catch (int) { cout << "l"; } }
int main() { try { Y a; } catch (...) { cout << "m"; return 1; } cout << "n"; return 0; } 5.12. Что будет выдано в стандартный поток вывода при работе следующей программы?
void f(X & x, int n); struct X { X () { try { f(*this, 1); cout << "a"; } catch (X){ cout << "b"; } catch (int){ cout << "c"; } } X (X &){ cout << "d"; } virtual ~X () { cout << "e"; } };
struct Y: X { Y () { try { f (* this, 1); cout << "f"; } catch (Y){ cout << "g"; } catch (int){ cout << "h"; } cout << "i"; } Y (Y &){ cout << "j"; } ~Y (){ cout << "k"; } };
void f(X & x, int n) { try { if (n < 0) throw -n; else if (n == 0) throw x; else throw n; } catch (int){ cout << "l"; } }
int main() { try { Y a; } catch (...){ cout << "m"; return 1; } cout << "n"; return 0; }
5.13. Что напечатает следующая программа?
struct S { S (int a) { try { if (a > 0) throw * this; else if (a < 0) throw 0; } catch (S &) { cout << “SCatch_S&” << endl; } catch (int) { throw; } cout << “SConstr” << endl; } S (const S & a) { cout << “Copy” << endl; } ~S () { cout << “Destr” << endl; } };
int main () { try { S s1(1), s2(-2); cout << “Main” << endl; } catch (S &) { cout << “MainCatch_S&” << endl; } catch (...) { cout << “MainCatch_...” << endl; } return 0; }
5.14. Что напечатает следующая программа?
struct S { S (int a) { try { if (a > 0) throw * this; Else if (a < 0) throw 0; } catch (S &) { cout << “SCatch_S&” << endl; } catch (int) { throw; } cout << “SConstr” << endl; } S (const S & a) { cout << “Copy” << endl; } ~S () { cout << “Destr” << endl; } };
int main () { try { S s1(0), s2 (5); cout << “Main” << endl; } catch (S &) { cout << “MainCatch_S&” << endl; } catch (...) { cout << “MainCatch_...” << endl; } return 0; }
5.15. Что напечатает следующая программа?
struct S { S (int a) { try { if (a > 0) throw * this; else if (a < 0) throw 0; } catch (S &) { cout << “SCatch_S&” << endl; throw;} catch (int) { cout << “SCatch_int” << endl; } cout << “SConstr” << endl; } S (const S & a) { cout << “Copy” << endl; } ~S () { cout << “Destr” << endl; } };
int main () { try { S s1(-3), s2(25); cout << “Main” << endl; } catch (S &) { cout << “MainCatch_S&” << endl; } catch (...) { cout << “MainCatch_...” << endl; } return 0; }
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|