4973

Виртуальные и статические элементы классов

Лекция

Информатика, кибернетика и программирование

Виртуальные и статические элементы классов Виртуальные функции При создании производных классов на основе базовых путем наследования часто возникает ситуация, когда в нескольких класса используется функция с одними и тем же именем и набором параметр...

Русский

2012-11-30

28.83 KB

3 чел.

Виртуальные и статические элементы классов

Виртуальные функции

При создании производных классов на основе базовых путем наследования часто возникает ситуация, когда в нескольких класса используется функция с одними и тем же именем и набором параметров. Наиболее распространенным примером могут послужить определяемые в каждом классе функции ввода с клавиатуры и печати на экране.

В случае, если мы работаем непосредственно с объектами, выбор функции осуществляется в зависимости от типа объекта.

Динамическая структура данных, например, список или массив указателей, позволяет хранить адреса объектов, как базового, так и производного класса, причем элементы структуры данных объявлены как указатели на объекты базового класса. В этих указателях могут храниться адреса объектов как базового, так и производного классов. И для этих объектов могут вызываться функции с одинаковыми именами.

Пример

Базовый класс

Данные

Функции

Person

char* Name

Print

Производный класс

Данные

Функции

Student

float Rating

Print

Функция Print для объектов класса Person должна печатать только фамилию, а функция Print для объекта класса Student – фамилию и рейтинг.

Person P1(“Romanov”);

Student S1(“Sidorov”,4.5);

P1.Print();//Вызов путем прямой адресации

S1.Print();

Person *M[2];

M[0]=P1;

M[1]=S1;

for(int i=0;i<2;i++)

M[i]->Print();

 В этом случае компилятор не в состоянии определить, какую функцию необходимо вызывать.  Он будет по умолчанию вызывать функцию Print из базового класса. На экране для всех объектов классов, производных от класса Person, будет печататься только фамилия, как задано в базовом классе.

Для разрешения данного затруднения С++ предусматривает использование виртуальных функций (virtual). Использование виртуального метода позволяет осуществить выбор метода, подходящего для конкретного объекта в процессе работы программы, а не во время компиляции. В данном случае используется механизм динамического связывания. Для определения виртуального метода используется ключевое слово virtual. Если в базовом классе метод объявлен как виртуальный, то метод с тем же именем и списком параметров в производных классах так же будет виртуальным.

Правила работы с виртуальными методами:

  1.  В производном классе нельзя переопределить метод, отличающийся от виртуального метода базового класса только типом возвращаемого значения.
  2.  Виртуальный метод должен быть методом некоторого класса, но не может быть статическим методом
  3.  Если виртуальный метод не переопределен в производном классе, то при его вызове будет происходить обращение к соответствующему методу базового класса.

Пример работы с виртуальными функциями

Абстрактные методы и классы

При определении базового класса виртуальные методы часто определяют как абстрактные с помощью спецификатора =0 virtual void f(int )=0;

Класс содержащий, хотя бы один абстрактный метод, называют абстрактным классом. Абстрактный класс служит только для формирования производных классов. Объект абстрактного класса создать невозможно.

Пример создания производного класса на основе базового абстрактного класса.

Статические переменные и функции класса

Каждый объект некоторого класса состоит из определенного набора элементов данных, описанных в классе. При решении некоторых задач возникает необходимость организации элементов данных, общих для всех объектов данного класса, созданных в программе. Такие элементы данных называют статические.

static int k;

static void PrintAll();

Статический элемент данных может иметь следующий смысл:

  1.  количество объектов данного класса
  2.  адрес структуры данных, в которую объединены все объекты данного класса.

Person::k

Person::PrintAll

#pragma once

class Person

{

public:

Person(void);

~Person(void);

private:

 char* Fio;

 int Age;

 

public:

 static Person** Mas;

 static int n;

 void SetAll(char* Fio1, int Age1);

 void Print(void);

 bool operator <(Person& P2);

 static void PrintAll(void);

Person(char* Fio1, int Age1);

};

#include "StdAfx.h"

#include ".\person.h"

#include <string.h>

Person::Person(void)

: Fio(NULL)

, Age(0)

{

}

Person::~Person(void)

{

}

void Person::SetAll(char* Fio1, int Age1)

{

Fio=new char[strlen(Fio1)];

strcpy(Fio,Fio1);

Age=Age1;

}

void Person::Print(void)

{

printf("%s %d\n",Fio,Age);

}

// Сравнение объектов на меньшинство по алфавиту и по возрасту

bool Person::operator < (Person& P2)

{

 if(strcmp(Fio,P2.Fio)<0)

 return true;

 else

 if(strcmp(Fio,P2.Fio)==0 && Age<P2.Age)

  return true;

 else

  return false;

 return false;

}

void Person::PrintAll(void)

{

 for(int i=0;i<n;i++)

 Mas[i]->Print();

}

Person::Person(char* Fio1, int Age1)

{Fio=new char[strlen(Fio1)];

strcpy(Fio,Fio1);

Age=Age1;

n++;

}#include "StdAfx.h"

#include ".\person.h"

#include <string.h>

Person::Person(void)

: Fio(NULL)

, Age(0)

{

}

Person::~Person(void)

{

}

void Person::SetAll(char* Fio1, int Age1)

{

Fio=new char[strlen(Fio1)];

strcpy(Fio,Fio1);

Age=Age1;

}

void Person::Print(void)

{

printf("%s %d\n",Fio,Age);

}

// Сравнение объектов на меньшинство по алфавиту и по возрасту

bool Person::operator < (Person& P2)

{

 if(strcmp(Fio,P2.Fio)<0)

 return true;

 else

 if(strcmp(Fio,P2.Fio)==0 && Age<P2.Age)

  return true;

 else

  return false;

 return false;

}

void Person::PrintAll(void)

{

 for(int i=0;i<n;i++)

 Mas[i]->Print();

}

Person::Person(char* Fio1, int Age1)

{Fio=new char[strlen(Fio1)];

strcpy(Fio,Fio1);

Age=Age1;

 n++;

}

#include "stdafx.h"

#include ".\person.h"

Person** Person::Mas=new Person*[10];

int Person::n=0;

main()

{

Person P1("Sidorov",20),P2("Petrov",30);

//Person::Mas=new Person*[2];

Person::Mas[0]=&P1;

Person::Mas[1]=&P2;

Person::PrintAll();

delete Person::Mas;

}


 

А также другие работы, которые могут Вас заинтересовать

36633. Конспект сюжетного физкультурного занятия для детей старшего дошкольного возраста 34.5 KB
  Упражнять детей в подбрасывании мяча вверх двумя руками и ловле его в ходьбе отбивании мяча в ходьбе по гимнастической скамейке двумя руками ведении мяча змейкой между предметами поочередно каждой рукой добиваться ритмичности и четкости выполнения движений на каждый таг формировать чувство мяча соотносить силу удара с высотой полета мяча. Проводится комплекс общеразвивающих упражнений с мячами. В: прокатывание мяча между ладонями 6 7 раз. В: прыжки вокруг мяча в чередовании с ходьбой на месте 5x3 раза.
36634. Как устроен компьютер 50.5 KB
  Организационный момент психологический настрой 1 мин: На доске запущена презентация с загадкой: Напишу и сосчитаю ошибку укажу Я и музыку сыграю И картинку покажу Я хотя росточком мал Но большой универсал компьютер Тема нашего урока Как устроен компьютер слайд 2 Постановка целей урока 3 мин Что такое компьютер это универсальное устройство для хранения обработки и передачи информации Из каких устройств состоит компьютер системный блок монитор клавиатура мышь и др....
36635. Количество информации, как мера уменьшения неопределенности знаний 37.5 KB
  Тип урока: комбинированный Цели: Обучающая дать определение единицы измерения информации; развивающая – развивать интерес к изучаемой теме логическое мышление; воспитывающая – воспитывать у ребят дисциплинированность и внимательность на уроке. Тема нашего сегодняшнего занятия Количество информации как мера уменьшения неопределенности знаний. Процесс познания окружающего мира приводит к накоплению информации в форме знаний.
36636. Інструкція з безпеки праці 46.5 KB
  Тому дайте будьласка відповіді на такі питання: Назвіть основні положення кодексу законів про працю Назвіть основний закон що гарантує право громадян на безпечні та нешкідливі умови праці Що зобов’язаний роботодавець забезпечити Які створює держава умови Які Ви знаєте законодавчі акти з охорони праці Активізація нового матеріалу: А темою уроку є €œІнструкція з безпеки праці€. На уроках €œВиробничого навчання€ ми застосовуємо безпосередньо отриманні знання з охорони праці адже уявлення безпеки праці і виховування вміння до...
36637. Економічна інформатика 1.16 MB
  Інформаційні технології - технологічні процеси, що охоплюють інформаційну діяльність управлінських працівників, повязану з підготовкою і прийняттям управлінських рішень. Являють собою сукупність методів і прийомів розвязання типових задач обробки даних. Включають збір, зберігання, передачу, обробку інформації.
36638. Предмет і задачі вірусології 484.5 KB
  Історія вірусології досить незвичайна. Перша вакцина для попередження вірусної інфекції — віспи була запропонована англійським лікарем Є. Дженнером в 1796 г., майже за сто років до відкриття вірусів, друга вакцина — антирабічна була запропонована засновником мікробіології Л. Пастером в 1885 г.— за сім років до відкриття вірусів.
36639. Охорона праці в галузі загальні Міжнародна економіка 475.5 KB
  Охорона праці в галузі загальні вимоги Конспект лекцій для напряму підготовки 6. МІЖНАРОДНІ НОРМИ І ЗАКОНОДАВСТВО УКРАЇНИ В ГАЛУЗІ ОХОРОНИ ПРАЦІ Лекції № 1 1. Стан безпеки праці в світі 2. Європейський Союз і законодавство з охорони праці 6.
36640. СТАНДАРТИЗАЦІЯ ТА СЕРТИФІКАЦІЯ ТОВАРІВ І ПОСЛУГ 171.1 KB
  Тому проблема забезпечення і підвищення якості продукції актуальна для всіх країн і підприємств. При цьому необхідно врахувати те що підвищення якості продукції задача довгострокова і безперервна. Рівень якості продукції не може бути постійною величиною. Тому вирішувати її традиційними методами тобто лише шляхом контролю якості готової продукції практично не можливо.
36641. Економічна теорія 1.56 MB
  Попри певну обмеженість вчення досягненням фізіократів було те що вони вперше походження багатства повязали не зі сферою обміну а зі сферою виробництва. Найважливішим внеском класичної політекономії в економічну науку вважається остаточне перенесення аналізу зі сфери обігу до сфери виробництва. Маркс доводив неспроможність капіталізму та сформулював його основну суперечність що існує між суспільним характером виробництва та приватною формою привласнення доходів. відома як Велика депресія виявила що вільна некерована економіка не...