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

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




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