Главная » Статьи » C++ » Статьи по С++

Скачивать материалы с сайта, могут только зарегистрированные пользователи.
Для регистрации заполните два поля ниже!

Через минуту Вы получите "Гостевой доступ"




Полиморфизм C++
Полиморфизм C++

Полиморфизмом в программировании называется переопределение наследником функций-членов базового класса, например


class Figure {
...
void Draw() const;
...
};

class Square : public Figure {
...
void Draw() const;
...
};

class Circle : public Figure {
...
void Draw() const;
...
};

В этом примере, какая из функций будет вызвана — Circle::Draw(), Square::Draw() или Figure::Draw(), определяется во время компиляции. К примеру, если написать

Figure* x = new Circle(0,0,5);
x->Draw();

то будет вызвана Figure::Draw(), поскольку x — объект класса Figure. Такой полиморфизм называется статическим.

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

class Figure {
...
virtual void Draw() const;
...
};

class Square : public Figure {
...
virtual void Draw() const;
...
};

class Circle : public Figure {
...
virtual void Draw() const;
...
};

Figure* figures[10];
figures[0] = new Square(1, 2, 10);
figures[1] = new Circle(3, 5, 8);
...
for (int i = 0; i < 10; i++)
figures[i]->Draw();

В этом случае для каждого элемента будет вызвана Square::Draw() или Circle::Draw() в зависимости от вида фигуры.

Чисто виртуальной функцией называется функция-член, которая объявлена со спецификатором = 0:

class Figure {
...
virtual void Draw() const = 0;
);

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

Друзья

Функции-друзья — это функции, не являющиеся функциями-членами и тем не менее имеющие доступ к защищённым и собственным полям и функциям-членам класса. Они должны быть описаны в теле класса как friend. Например:

class Matrix {
...
friend Matrix Multiply(Matrix m1, Matrix m2);
...
};

Matrix Multiply(Matrix m1, Matrix m2) {
...
}

Здесь функция Multiply может обращаться к любым полям и функциям-членам класса Matrix.

Существуют также классы-друзья. Если класс A — друг класса B, то все его функции-члены могут обращаться к любым полям и функциям членам класса B. Например:

class Matrix {
...
friend class Vector;
...
};

Однако в С++ не действует правило «друг моего друга — мой друг».

По стандарту C++03 вложенный класс не имеет прав доступа к закрытым членам объемлющего класса и не может быть объявлен его другом (последнее следует из определения термина друг как нечлена класса). Тем не менее, многие широко распространённые компиляторы нарушают оба эти правила (по всей видимости, ввиду совокупной странности этих правил).



Категория: Статьи по С++ | Добавил: c1 (2009 Июнь 16)
Просмотров: 4566 | Теги: Полиморфизм C++ | Рейтинг: 0.0/0

Выразить благодарность - Поделиться с друзьями!

 

Здесь все о технической стороне 1С!

 

Узнай, как правильно администрировать 1С Предприятие
Регистрируйся на бесплатный 7-ми дневный курс сейчас:

Ваш E-Mail в безопасности



Всего комментариев: 0
avatar