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;

}


 

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

73229. ДЕРЖАВНІ ТА НАЦІОНАЛЬНІ УКРАЇНСЬКІ СИМВОЛИ 88.5 KB
  Обладнання: карта України; зображення українського державного прапора та гербатризуба; малюнки із зображеннями калини віночка писанки рослинсимволів тощо; ватманський аркуш з кросвордом Україна; аудіоапаратура; свічка. Бучин ської Моя Україна. Приспів: Є на світі моя країна де червона цвіте калина Гори ріки і полонини це моя Україна. Є на світі одна країна найчарівніша як перлина В моїм серці вона єдина це моя Україна.
73230. МЕНЕДЖМЕНТ ПРОФЕСІЙНОЇ ДІЯЛЬНОСТІ 1.04 MB
  Для проведення маркетингових досліджень керівництвом підприємства прийнято рішення про проведення діагностичних опитувань (інтерв’ю) потенційних споживачів продукції. Аналіз вибірки зі 100 перехожих дозволив отримати дані щодо кількості перехожих, що з’являлись з відповідним інтервалом, кількості перехожих, що дали згоду на участь у опитуванні, та тривалості проведення одного інтерв’ю
73231. Обучение детей младшего школьного возраста анализу произведений изобразительного искусства 178.5 KB
  Тогда как именно знакомство со структурой художественного произведения и с законами восприятия искусства должно актуализировать исследовательскую позицию учащегося благодаря которой он сможет самостоятельно постигнуть смысл живописного или графического произведения освоить способы художественного мышления. Однако при обращении к произведениям искусства учитель чаще всего выступает в качестве всезнающего лектора ученик же в качестве пассивного зрителя и слушателя. До сих пор не существует технологий и методик благодаря которым учащиеся...
73232. Разработка международной стратегии продвижения товара 749.5 KB
  Теоретический анализ разработки международной стратегии продвижения товара; исследование особенностей международных стратегий ВЭД предприятий; анализ финансовой, хозяйственной, внешнеэкономической и маркетинговой деятельности предприятия; разработка стратегии выхода предприятия на зарубежный рынок.
73233. АНТРОПОЦЕНТРИЧЕСКАЯ ОЦЕНКА МОРАЛЬНОЙ РАСПУЩЕННОСТИ В СОВРЕМЕННОМ АНГЛИЙСКОМ ЯЗЫКЕ 36.85 KB
  Семантическая структура языка являет собой языковое воплощение всех нюансов восприятия действительности его носителями всех представлений и переживаний присущих народу создавшему язык. Поэтому каждый язык это своеобразное зеркало отражающее определённое видение мира неповторимое мироощущение народа сотворившего его сегментацию внутреннего и внешнего мира представленную отдельными структурами и...
73234. Механизм воздействия рекламы на потребителя на примере компании P and G 1.41 MB
  Определить содержание понятия «реклама». Выявить основные характеристики и функции рекламы. Проанализировать воздействие рекламы на потребителя. Выявить основные механизмы воздействия рекламы на потребителей используемые ведущими мировыми компаниями, в частности...
73235. Межпоколенная коммуникация 124 KB
  Семья – это общественная ячейка, в которой одновременно уживаются представители разных поколений. В связи с меняющимися ценностями и интересами, не редко возникают конфликты между членами семьи, потому как каждый пытается доказать свою точку зрения как единственно верную.
73236. Экономика электроснабжения 1.02 MB
  Электроэнергетика, ведущая область энергетики. Без которой невозможно стабильное развитие промышленности, сельского хозяйства, транспорта, коммунальных хозяйств, невозможно развитие средств связи, вычислительной и космической техники
73237. ДИНАМИКА КУЛИСНОГО МЕХАНИЗМА 391.45 KB
  Заданы массы звеньев механизма; величина вращающего момента; радиус инерции катка и радиусы его ступеней; радиус маховика представляющего собой сплошной однородный цилиндр. Определить: Угловую скорость маховика при его повороте на угол. Угловое ускорение маховика при его повороте на угол.