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;

}


 

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

36292. Журнализация изменений БД, файл журнала, контрольные точки 31.5 KB
  Это требование предполагает возможность восстановления согласованного состояния базы данных после любого программного или аппаратного сбоя. Типичная СУБД должна предоставлять такие функции восстановления как: механизм резервного копирования предназначенный для периодического создания копий базы данных; средства ведения журнала в котором фиксируются текущее состояние транзакций и вносимые в базы данных изменения; функция создания контрольных точек обеспечивающая перенос выполняемых в базе данных изменений во вторичную помять с целью...
36293. Восстановление базы данных 28 KB
  При этом надо устранить последствия операторов модификации базы данных которые выполнялись в этой транзакции. Ситуация характеризуется потерей той части базы данных которая к моменту сбоя содержалась в буферах оперативной памяти. Восстановление после поломки основного внешнего носителя базы данных жесткий сбой.
36294. Техническое задание. Основные разделы 36.5 KB
  Техническое задание это документ определяющий цели требования и основные исходные данные необходимые для разработки автоматизированной системы управления. требования к программе или программному изделию; требования к функциональным характеристикам; требования к составу выполняемых функций организации входных и выходных данных временным характеристикам требования к надежности; требования к обеспечению надежного функционирования обеспечения устойчивого функционирования контроль входной и выходной информации время восстановления...
36295. Состав и содержание работ на стадиях внедрения, эксплуатации и сопровождения проекта 39.5 KB
  Недостатком первого подхода является увеличение длительности внедрения что ведет за собой рост стоимости проекта. При использовании второго подхода сокращается время внедрения но возникает возможность пропуска ошибок в проектной документации поэтому чаще всего используют смешанный метод внедрения проекта ЭИС. Внедрение проекта осуществляется в течение трех этапов: подготовка объекта к внедрению; опытное внедрение; сдача проекта в промышленную эксплуатацию.
36296. САSЕ – средства, классификация 26 KB
  Аббревиатура САSЕ Соmputеrаidеd Softwre Епgineering автоматизированная разработка ПО обозначает специальный тип программного обеспечения предназначенного для поддержки отдельных этапов создания ПО таких как разработка требований проектирование кодирование и тестирование программ. Поэтому к САSЕсредствам относятся редакторы проектов словари данных компиляторы отладчики средства построения систем и т. САSЕтехнологии предлагают поддержку процесса создания ПО путем автоматизации которых этапов разработки а также создания и...
36297. Типы пользовательского интерфейса 27.5 KB
  Процедурно-ориентированный интерфейс использует традиционную модель взаимодействия с пользователем основанную на понятиях процедура и операция. Объектно-ориентированные интерфейсы используют модель взаимодействия с пользователем ориентированную на манипулирование объектами предметной области. Процедурноориентированные интерфейсы: 1Обеспечивает пользователю функции необходимые для выполнения задач; 2Акцент делается на задачи; 3Пиктограммы представляют приложения окна или операции; 4Содержание папок и справочников отражается с...
36298. Понятие рекурсии. Прямая и косвенная рекурсия 23.5 KB
  Рекурсия – это такой способ организации программы когда процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе. Примером программы с использованием рекурсии может быть программа вычисления факториала числа. Программы которые используют рекурсивные процедуры отличаются простотой наглядностью и компактностью текста. Максимальное число рекурсивных вызовов процедуры без возвратов которое происходит во время выполнения программы называется глубиной рекурсии.
36299. Работа с динамическими переменными 394 KB
  Использование идентификатора указателя в программе означает обращение к адресу ячейки памяти на которую он указывает. Выделение и освобождение памяти под динамические переменные выполняется стандартными процедурами New Dispose во время работы программы. Р В неопределенном состоянии указатель бывает в начале работы программы до первого присваивания ему или конкретного адреса или пустого адреса nil а также после освобождения области памяти на которую он указывает. b:=nil; Процедура New: выделяет область памяти соответственно тому...
36300. Теория автоматического управления 3.73 MB
  Управление по возмущению управление без обратной связи по регулируемой величине – разомкнутые системы управления. Управление по отклонению управление с обратной связью по регулируемой величине – замкнутые системы управления. Управление в разомкнутых системах может осуществляться: а в виде программного управления: при этом регулятор УУ действует по заранее заданной жесткой программе.