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;

}


 

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

75404. Общая характеристика категории падежа. Количество падежей и принципы их выделения. Типы информации, передаваемой падежами. Особые падежные конструкции в русском языке 47.5 KB
  Общая характеристика категории падежа. Количество падежей и принципы их выделения. Типы информации передаваемой падежами. Особые падежные конструкции в русском языке.
75405. Типы склонения существительных 15.83 KB
  Изменение слова по падежам называется склонением. Склонение – 1) класс слов, объединенных общностью словоизменения, 2) отвлеченный образец, по которому изменяются слова этого класса. В современном русском языке существует три таких класса (три склонения) – первое, второе и третье
75406. Степени сравнения прилагательных. Проблема их включения в состав форм прилагательных. Вопрос о существовании простой превосходной степени 14.71 KB
  Степени сравнения прилагательных. Вопрос о существовании простой превосходной степени. Категория степени сравнения у прилагательных это словоизменительная морфологическая категория образуемая двумя рядами противопоставленных друг другу форм с морфологическими значениями положительной и сравнительной степени. В формах положительной степени заключено морфологическое значение представляющее названный прилагательным признак вне сравнения по степени его проявления.
75407. Прилагательное как часть речи. Разряды прилагательных по значению и их влияние на изменение слов. Противопоставление кратких и полных форм и его функции 389.5 KB
  Ряд отличительных черт: имеют два ряда форм полные атрибутивные и краткиепредикативные образуют формы сравнит. У них всегда производная основа они склоняются но не образуют степеней сравнения и краткой формы у них отсутствуют все признаки свойственные качественным прилагательным. Полные склоняемые формы называются атрибутивными краткие несклоняемые предикативными. Соотносительные полные и краткие формы имеют только качественные прилаг.
75409. Вводные слова и основания для их выделения в особую часть речи 29 KB
  Вводные слова и основания для их выделения в особую часть речи. Как особая часть речи нередко рассматриваются вводные или модальные слова. Это неизменяемые слова производные от слов иных частей речи при помощи которых выражается субъективное отношение говорящего к высказыванию или его части с точки зрения достоверности недостоверности т. Как правило эти слова выступают в синтаксической функции вводного слова: вопервых итак разумеется вернее дескать всего подобных слов около трёхсот.
75410. Проблема местоимений как особой части речи. Особенности местоименной семантики и функции местоименных слов. Основания для их разведения по разным частям речи 12.67 KB
  Термин местоимение в грамматической науке употребляется также применительно к более широкому кругу слов, чем местоимения-существительные: местоимениями называются слова – существительные, прилагательные, числительные
75411. Проблема слов «категории состояния». Их признаки и основания для выделения в особую часть речи. Понятие «предикатив» и его соотношение с «категорией состояния» 13.23 KB
  Проблема слов категории состояния. Понятие предикатив и его соотношение с категорией состояния. Категория состояния это класс слов которые обозначают независимый признак состояние душевное физическое или эмоциональное состояние человека окружающей среды и природы и не имеют форм словоизменения склонения и спряжения но могут с помощью глаголасвязки выражать значение времени. При характеристике категории состояния как части речи основная трудность связана с необходимостью отграничивать эти слова от омонимичных им форм...
75412. Наречие как часть речи. Проблема компаратива 17.62 KB
  Главным формальным признаком наречия как части речи является отсутствие словоизменения. Исключение составляют наречия образующие формы сравнительной степени. По своему общему значению непроцессуального признака наречия близки прилагательным. Этим значением определяются синтаксические функции наречий: вопервых они определяют глагол имя или другое наречие соединяясь с ним связью примыкания; вовторых наречия свободно употребляются в функции сказуемого; втретьих наречия определяют предложение в целом.