Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++_навч_пос14_new.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.86 Mб
Скачать

3.19 Динамічний поліморфізм, віртуальні функції (2)

#include <iostream.h>

class A//базовий клас A

{

protected:

int a;

public:

A(int ia):a(ia){};

//віртуальна функція

virtual int sum() //спробуйте без слова virtual

{return a;}

void print()//метод

{cout<<sum()<<endl;}

};

class B: public A//клас B, він успадковує клас A

{

protected:

int b;

public:

B(int ia, int ib):A(ia),b(ib){};

int sum()//віртуальна функція

{return a+b;}

};

void main()

{

B obj(2,3);//створити об’єкт класу B

//при виклику методу print буде викликаний метод sum класу B,

//а не A, оскільки sum віртуальний

obj.print();

}

3.20 Успадкування множинне

#include <iostream.h>

class A//базовий клас A

{

protected://захищені члени

int a;

public://відкриті члени

A(int ia):a(ia){};//конструктор

};

class B//базовий клас B

{

protected://захищені члени

int b;

public://відкриті члени

B(int ib):b(ib){};//конструктор

};

//клас C, він успадковує клас A і B

class C:public A, public B

{

//закриті члени

int c;

public://відкриті члени

C(int ia, int ib, int ic):A(ia),B(ib),c(ic){};//конструктор

int sum(){return a+b+c;}

};

void main()

{

//створити об’єкт класу C; a=2, b=3, c=4

C obj(2,3,4);

cout<<obj.sum();

}

3.21 Діамантове успадкування

#include <iostream.h>

class A//базовий клас A

{

protected:

int a;

public:

A(int ia):a(ia){};

};

//клас B, він успадковує клас A

class B: public A

{

protected:

int b;

public:

B(int ia, int ib):A(ia),b(ib){};

};

//клас C, він успадковує клас A

class C: public A

{

protected:

int c;

public:

C(int ia, int ic):A(ia),c(ic){};

};

//клас D, він успадковує клас B і C

class D:public B, public C

{

int d;

public:

D(int ia1, int ia2, int ib, int ic, int id):B(ia1,ib),C(ia2,ic),d(id){};

void print()

{cout<<B::a<<C::a<<b<<c<<d;}

};

void main()

{

//створити об’єкт класу D; B::a=1, C::a=2, b=3, c=4, d=5

D obj(1,2,3,4,5);

obj.print();

}

3.22 Діамантове віртуальне успадкування

#include <iostream.h>

class A//базовий клас A

{

protected:

int a;

public:

A():a(0){}; //конструктор по замовчуванню

A(int ia):a(ia){};

};

//клас B, він віртуально успадковує клас A

class B: virtual public A

{

protected:

int b;

public:

B(int ia, int ib):A(ia),b(ib){};

};

//клас C, він віртуально успадковує клас A

class C: virtual public A

{

protected:

int c;

public:

C(int ia, int ic):A(ia),c(ic){};

};

//клас D, він успадковує клас B і C

class D:public B, public C

{

int d;

public:

D(int ia, int ib, int ic, int id):B(ia,ib),C(ia,ic),d(id){};

void print()

{cout<<a<<b<<c<<d;}

};

void main()

{

//створити об’єкт класу D; a=2, b=3, c=4, d=5

D obj(2,3,4,5);

obj.print();

}

3.23 Динамічне приведення і ідентифікація типів (dynamic_cast і typeid)

#include <iostream.h>

#include <typeinfo.h>//заголовочний файл для ідентифікації типів

class A//поліморфний клас A

{virtual void f(void){}};//віртуальна функція

class B//пустий клас B

{ };

class C : public A, public B //множинне успадкування A і B класом C

{ };

void main()

{

C objc, *pobjc;//оголосити об’єкт і вказівник класу C

A *pobja = &objc;//оголосити вказівник класу A, який вказує на об’єкт objc

if ((pobjc = dynamic_cast<C *>(pobja)) != 0)//якщо приведення pobja до типу C* успішне

{cout<<typeid(pobjc).name()<<endl;} //то інформація про тип pobjc

B *pobjb;//оголосити вказівник класу B

if ((pobjb = dynamic_cast<B *>(pobja)) != 0)//якщо приведення pobja до типу B* успішне

{cout << typeid(pobjb).name() << endl;} //то інформація про тип pobjb

}