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;

}


 

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

37203. Правовое регулирование рынка ценных бумаг 27 KB
  О рынке ценных бумаг далее Закон о РЦБ регулирует отношения возникающие при эмиссии и обращении эмиссионных ценных бумаг при осуществлении профессиональной деятельности на рынке ценных бумаг а также устанавливает основы государственного регулирования данного рынка. О защите прав и законных интересов инвесторов на рынке ценных бумаг устанавливает меры направленные на обеспечение государственной и общественной защиты прав и законных интересов физических и юридических лиц объектом инвестирования которых являются эмиссионные ценные...
37204. Ценная бумага 78 KB
  С продажей ценной бумаги все права обязательства и отношения переходят к её новому владельцу. В Гражданском Кодексе РФ можно найти перечень видов ценных бумаг: государственная облигация облигация вексель чек депозитные и сберегательные сертификаты банковские сберегательные книжки на предъявителя коносаменты акции приватизационные ценные бумаги и другие документы которые законами о ценных бумагах или в установленном ими порядке отнесены к числу ценных бумаг. Атрибутами ценной бумаги являются: имущественные права отношения...
37205. Ры́нок це́нных бума́г, фо́ндовый ры́нок 92 KB
  По виду ценных бумаг рынок облигаций рынок акций рынок производных финансовых инструментов. По эмитентам рынок ценных бумаг предприятий рынок государственных ценных бумаг и т. По срокам рынок кратко средне долгосрочных и бессрочных ценных бумаг.
37206. Медицинское страхование 45.5 KB
  Независимо от величины этого взноса все граждане имеют равные права на получение определенного объема медицинской помощи оплата которой производится за счет страховых средств. Перед системой ОМС стоят три основные задачи: обеспечение равных возможностей получения медицинской помощи для всех жителей территории: обеспечение финансовой устойчивости; полный охват страхованием населения Российской Федерации. Охрана здоровья граждан представляет собой совокупность различных мер государства направленных на сохранение и укрепление физического и...
37207. Страхово́й тари́ф 27.5 KB
  Устанавливается как правило в процентах по отношению к страховой сумме. Страховой тариф может устанавливаться: 1. с единицы страховой суммы; 2.
37208. Виды страхования 65.5 KB
  Исторически страхование началось с видов и затем разрасталось до уровня отраслей. Страхование имущества Юридические и физические лица могут заключать договоры страхования на объекты в отношении которых они имеют имущественный интерес: здания сооружения передаточные устройства силовые рабочие и другие машины оборудование транспортные средства ловецкие и другие суда орудия лова объекты незавершенного производства и капитального строительства инвентарь готовая продукция товары сырье материалы и другое имущество. Страхование квартиры...
37209. Развитие страхового рынка 33 KB
  Таким образом прогноз роста российского страхового рынка должен опираться на общий прогноз экономического развития. В целом прогнозы роста российской экономики которые делаются различными аналитическими центрами на ближайшие несколько лет выглядят умеренно оптимистичными. Прогнозы сделанные ЦСИ Росгосстраха приводят к более низким оценкам потенциального роста российской экономики. Методика на основании которой делается прогноз основана на зависимости темпов роста ВВП от удовлетворенности населения своей жизнью чем больше люди довольны...
37210. Финансовый менеджмент 25 KB
  Можно выделить две основные группы финансового менеджмента находящиеся в подчинении у главного финансиста на предприятии: 1. Основными функциями финансового менеджера являются: аналитическоконтрольные; финансовое планирование; принятие управленческих решений. В целом в функциональные обязанности финансового менеджера входят: текущая деятельность связанная с движением денежных фондов предприятия; финансовое планирование прогнозирование; проведение операций на финансовых рынках; инвестирование; финансовый анализ и контроль за финансовым...
37211. Базовые концепции финансового менеджмента 49.5 KB
  Концепция временной стоимости денег Концепция изменения стоимости денег во времени играет центральную роль в практике финансовых вычислений и выражает необходимость учета фактора времени при осуществлении долговременных финансовых операций путем оценки и сравнения стоимости денег в начале финансирования проекта и при их возврате в виде будущих денежных поступлений. Концепция временной стоимости денег заключается в том что стоимость денег с течением времени изменяется с учетом нормы прибыли на финансовом рынке в качестве которой обычно...