
Полиморфизм Полиморфизм – это принцип ооп, позволяющий включать в состав класса несколько функций с одинаковыми именами, но выполняющих различные действия.
Статический полиморфизм — поддерживается посредством перегрузки функций и операторов во время компиляции
Динамический полиморфизм — поддерживается посредством виртуальных функций во время выполнения программы
Компилятор, обрабатывая вызов функции, сопоставляет список фактических параметров со списками формальных параметров всех методов класса, имеющих то же имя, и выбирает ту функцию, у которой список формальных параметров совпал со списком фактических параметров при вызове функции:
#include <string.h>
#include <iostream.h>
class Draw
{int x1, y1, x2, y2, r;
char *message;
public:
Draw();
virtual ~Draw();
void show();
void show(int xx1, int yy1, int xx2, int yy2);
void show(int xx1, int xx2, int rr);};
Draw::Draw()
{x1=x2=y2=y1=r=0;
message=new char[10];
strcpy(message, "text");}
Draw::~Draw()
{delete[] message;
message=NULL;}
void Draw::show()
{cout << message << endl;}
void Draw::show(int xx1,int yy1,int xx2,int yy2)
{cout << "Rectangle" << endl;}
void Draw::show(int xx1,int xx2,int rr)
{cout << "Circle" << endl;}
int main(void)
{Draw draw;
draw.show();
draw.show(1,1,20,10);
draw.show(10,10,10);
return 0;}
виртуальная функция —В ООП метод (функция) класса, который может быть переопределён вклассах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.
Виртуальные методы — один из важнейших приёмов реализации полиморфизма. Они позволяют создавать общий код, который может работать как с объектами базового класса, так и с объектами любого его класса-наследника. При этом базовый класс определяет способ работы с объектами и любые его наследники могут предоставлять конкретную реализацию этого способа.
Наследование
Наследование – это принцип ООП, посредством которого на базе существующих классов создаются новые классы, получающие по наследству от базовых классов свойства и методы. Наследование позволяет существенно экономить программный код.
Создание класса-наследника в С++
Пример базового класса
class Person
{
protected:
char Name[30];
public:
Person ();
void SetName (char* );
void Show ();
} ;
Класс-наследник
class Student : public Person
{
char dept[30];
public:
Student (char*, char* );
void SetDept (char* );
void Show ();
} ;
Новые классы наследуют только те свойства и методы, которые объявлены в разделах public и protected базовых классов. При этом свойства и методы из раздела protectedдоступны только базовому классу и его наследникам, тогда как свойства и методы из раздела public доступны объектам любого класса. Исключением из этого правила являются конструкторы и деструкторы, которые не наследуются. Методы класса Person
Person::Person()
{
}
void Person::SetName (char* N)
{
strcpy (Name, N);}
void Person::Show ()
{
std::cout << “My name is ” << Name << std::endl;}
Собственные методы класса Student
Student::Student (char* N, char* D)
{
strcpy (Name, N);
strcpy (Dept, D);
}
void Student::SetDept (char* D)
{
strcpy (Dept, D);
}
void Student::Show ()
{
std::cout << Name << “ “ << Dept << std::endl;
}
Как видно, методы класса student используют как собственное свойство, так и свойство, полученное по наследству.
Текст программы
int main ()
{
Person A;
A.SetName (“Tom”);
Student B(“Ann”, “MTS”);
A.Show ();
B.Show ();
Person* pperson = &B;
Student* pstudent = &B;
pperson->Show ();
pstudent->Show ();
B.SetName (“Kate”);
B.SetDept (“GF”);
pstudent->Show ();
return 0;
}
На экране:
My name is Tom
Ann MTS
My name is Ann
Ann MTS
Kate GF
Основные отличия языка C++
Язык C++ имеет множество дополнительных элементов по сравнению с языком C, которые могут быть откомпилированы только компилятором C++
Традиционно программы, написанные на C, имеют расширение *.c, на C++ – *.cpp, и для их компиляции выбирается соответствующий компилятор.
Основное и принципиальное отличие C++ от C составляют классы, эта составляющая языка рассмотрена в гл. 17. Также в C++ появляются новые элементы языка, такие как объекты-потоки для ввода/вывода данных cin и cout, новые операторы (:: – оператор разрешения области видимости), средства для управления памятью (операторы new и delete), шаблоны, обработка исключений.
Основные свойства ООП:
Инкапсуляция- сочетание в одном объекте данных и операций над ними.
Наследование- сохранение свойств базовых классов в производных.
Полиморфизм- присваивание имени некоторому действию, которое совместно используется всеми объектами в иерархии, причем каждый объект в иерархии организует(реализует) это действие своим собственным образом.
Инкапсуляция
Механизм, который объединяет данные и методы, манипулирующие этими данными и защищает и то и другое от внешнего вмешательства (неправильного использования).
Наследование
Процесс, посредством которого один объект может наследовать свойства другого объекта, добавлять к ним черты, характерные только для него. (Автомобиль-автобус).
Таким образом не надо каждый раз описывать все с нуля. Это и есть главное преимущество наследования.
В ООП класс, от которого наследуют, принято называть базовым/ родительским.
Класс, который получается называется порожденным/производным.