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;

}


 

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

75317. Понятие “феодализма” в западноевропейской историографии 39.5 KB
  Понятие феодализма в западноевропейской историографии. Понимание феодализма в историографии XVIII в. Главными чертами феодализма некоторые из них считали политическую раздробленность и как следствие ее господство в средние века папской теократии. в определении сущности феодализма недалеко ушли от историков эпохи Просвещения хотя в отличие от них оценивали феодализм как положительное историческое явление: реакционные романтики потому что видели в нем свой политический идеал...
75318. Проблема генезиса феодализма в отечественной и зарубежной историографии 46.5 KB
  Проблема генезиса феодализма в отечественной и зарубежной историографии. Проблема генезиса феодализма и связанный с нею вопрос о путях складывания феодально зависимого крестьянства представляет трудность и с источниковедческой и с теоретической точек зрения. В советской историографии становление феодализма рассматривалось в первую очередь в аспекте вскрытия сдвигов в производительных силах в отношениях собственности...
75319. Образование государства и возникновение писаного права у франков 38.5 KB
  Образование государства и возникновение писаного права у франков. В исторических памятниках имя франков появилось начиная с III в. Франки распадались на две большие ветви приморских или салических франков от латинского слова slum что значит море живших у устья Рейна и прибрежных или рипуарских франков от латинского слова rip что значит берег живших южнее по берегам Рейна и Мааса. Из вождей франков известен Меровей при котором франки сражались против Аттилы на Каталаунских полях 451 г.
75320. Рост крупного землевладения и ослабление центральной власти у франков при преемниках Хлодвига. Объединение страны майордомами Австразии 33.5 KB
  После смерти Хлодвига началось дробление королевства. намечается обособление самостоятельных политических единиц в составе Франкского королевства: Нейстрии СевероЗападной Галлии с центром в Париже; Австразии северовосточной части Франкского королевства включавшей исконные франкские области по обоим берегам Рейна и Мааса; Бургундии территории бывшего королевства бургундов. В Нейстрии которая к моменту франкского завоевания была сильно романизована галлоримляне составлявшие и после завоевания большинство населения раньше чем в...
75321. Франция в IX-XI веках 39.5 KB
  В начале этого периода в стране имелось еще много крестьян не находившихся в какойлибо зависимости от частных лиц и подчинявшихся непосредственно короне. Вместе с тем возрастало число крестьян находившихся в личнонаследственной зависимости сервов и колонов а также жителей иммунитетных территорий. В результате все жители округи будь они в личной либо поземельной зависимости от данного или какогонибудь другого феодала или нет становились его людьми в судебноадминистративном отношении. Для по земельно и лично зависимых крестьян...
75322. Англия в XI-XII вв. Завершение феодализации английского общества 47 KB
  в Англии в основном уже господствовали феодальные порядки но процесс феодализации еще не завершился. Вильгельм со своим войском на больших ладьях переплыл ЛаМанш и высадился на юге Англии в бухте Павенси. Во главе последнего выступил избранный советом мудрых новый король Англии Гарольд. Герцог Нормандский же двинулся к Лондону захватил его и стал королем Англии под именем Вильгельма I Завоевателя.
75323. Особенности социально-экономического развития Италии в конце V- сер. XI веков 51 KB
  Особенности социальноэкономического развития Италии в конце V сер. Подвластное лангобардам коренное население Италии оставалось в сфере действия римского права. империи но не принесло Италии политического единства. Карл Великий изменил территориальноадминистративное деление своих владений в Италии: вместо герцогств были образованы 20 графств отданных в управление представителям франкской знати.
75324. Основные черты феодального строя в Западной Европе к концу XI века 32 KB
  Господствует феодальная земельная собственность в вид вотчины в сочетании с мелким индивидуальным крестьянским хозяйством. Основная масса крестьян находится уже в той или иной форме зависимости. На раннем этапе развития феодализма господствовало натуральное хозяйство; обмен был незначителен торговые связи не развиты; У лично зависимых крестьян особенно в крупных поместьях преобладала отработочная рента. Широко распространяется также натуральный оброк с крестьян находившихся в более легкой зависимости.