Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

Информатика, программирование
В настоящее время ни один человек не может представить себе жизни без компьютера, его влияние достигло очень больших масштабов. Мы можем заметить, что...полностью>>
Информатика, программирование
В нашем случае матрица А находится в ячейках B1:Е4, а вектор b в диапазоне G1:G4. Для решения системы методом обратной матрицы необходимо вычислить ма...полностью>>
Информатика, программирование
Твій ранок починається з читання багрепортів і аналізу логів. Ти щодня оновлюєш ПЗ і щогодини допрацьовуєш правила брандмаузера. Snort твій кращий дру...полностью>>
Информатика, программирование
Термін „інформація” походить від латинського слова “informatio” і означає роз’яснення, виклад фактів, подій. Загальне поняття інформації подано у філо...полностью>>

Главная

Сохрани ссылку в одной из сетей:

Виртуальные и статические элементы классов

Виртуальные функции

При создании производных классов на основе базовых путем наследования часто возникает ситуация, когда в нескольких класса используется функция с одними и тем же именем и набором параметров. Наиболее распространенным примером могут послужить определяемые в каждом классе функции ввода с клавиатуры и печати на экране.

В случае, если мы работаем непосредственно с объектами, выбор функции осуществляется в зависимости от типа объекта.

Динамическая структура данных, например, список или массив указателей, позволяет хранить адреса объектов, как базового, так и производного класса, причем элементы структуры данных объявлены как указатели на объекты базового класса. В этих указателях могут храниться адреса объектов как базового, так и производного классов. И для этих объектов могут вызываться функции с одинаковыми именами.

Пример

Базовый класс

Данные

Функции

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. Если в базовом классе метод объявлен как виртуальный, то метод с тем же именем и списком параметров в производных классах так же будет виртуальным.

Правила работы с виртуальными методами:

  • В производном классе нельзя переопределить метод, отличающийся от виртуального метода базового класса только типом возвращаемого значения.

  • Виртуальный метод должен быть методом некоторого класса, но не может быть статическим методом

  • Если виртуальный метод не переопределен в производном классе, то при его вызове будет происходить обращение к соответствующему методу базового класса.

Пример работы с виртуальными функциями

Абстрактные методы и классы

При определении базового класса виртуальные методы часто определяют как абстрактные с помощью спецификатора =0 virtual void f(int )=0;

Класс содержащий, хотя бы один абстрактный метод, называют абстрактным классом. Абстрактный класс служит только для формирования производных классов. Объект абстрактного класса создать невозможно.

Пример создания производного класса на основе базового абстрактного класса.

Статические переменные и функции класса

Каждый объект некоторого класса состоит из определенного набора элементов данных, описанных в классе. При решении некоторых задач возникает необходимость организации элементов данных, общих для всех объектов данного класса, созданных в программе. Такие элементы данных называют статические.

static int k;

static void PrintAll();

Статический элемент данных может иметь следующий смысл:

  • количество объектов данного класса

  • адрес структуры данных, в которую объединены все объекты данного класса.

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

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

return true;

else

return false;

return false;

}

void Person::PrintAll(void)

{

for(int i=0;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

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

return true;

else

return false;

return false;

}

void Person::PrintAll(void)

{

for(int i=0;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;

}


Похожие страницы:

  1. Программирование для Microsoft Windows с использованием Visual C++ и библиотеки классов MFC

    Книга >> Информатика, программирование
    ... имя оконного класса и стиль элемента управления. 4.1 Статические элементы управления ... классов. Макрос DECLARE_DYNCREATE добавляет в описание класса три компонента: статическую переменную CRuntimeClass, виртуальную функцию GetRuntimeClass и статическую ...
  2. Объектно-ориентированное программирование на С++

    Книга >> Информатика, программирование
    ... класса. Элементы-данные делятся на элементы-данные экземпляра (объекта) класса (нестатические данные) и на элементы-данные класса (статические ... его базового класса. Для виртуальных классов сделано исключение. Виртуальный базовый класс инициализируется самым ...
  3. Язык СИ++ Учебное пособие

    Книга >> Информатика, программирование
    ... , когда массив внешний или статический. В массиве STR элемент STR[4] равен '\0', а ... графического представления объектов (принадлежащих классам, вводимым программистом). В качестве ... символов textstring ПРИЛОЖЕНИЕ 5 КЛАССЫ И КОМПОНЕНТНЫЕ ФУНКЦИИ БИБЛИОТЕКИ ...
  4. Объектно-ориентированное программирование (5)

    Книга >> Информатика, программирование
    ... класс (подкласс) - виртуальная функция (подмена функций). Концепция класса вместе с производными классами и виртуальными ... создать объект вложенного нестатического класса в статическом контексте (в статическом методе, статическом блоке и т.п.). Доступ ...
  5. Языки программирования. Курс лекций

    Конспект >> Информатика, программирование
    ... статического класса» В C# статический класс – это особый вид класса, внутри которого есть только статические члены-функции и только статические ... классе: Полиморфный класскласс, в котором есть виртуальные функции (и. следовательно, таблица виртуальных ...

Хочу больше похожих работ...