Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Виртуальные функции. Абстрактные классы




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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...