Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++ делегирование и полиморфизм

45K
02 апреля 2011 года
botasa
45 / / 31.12.2010
Читаю Стивена Прата (Лекции и упражнения С++) и как не могу найти ответ на ниже поставленной вопрос ...
про полиморфизм понимаю немного ... это например конструктор, констурктор копирования, конструктор по дефолту (1 имя разные сигнатуры ) а про делегирование 1-й раз слышу или не понимаю ...

В чем разница между делегированием и полиморфизмом? Привести пример и на примере объяснить особенности применения каждого из типов организации связи между классами.
278
02 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
При полиморфизме объект с одной и той же спецификацией имеет разную реализацию, при этом сам реализует все свои возможности. При делегировании же объект внешне предоставляет некоторый набор возможностей, но при этом передает их реализацию другому объекту. Например:

Код:
abstract class A {
public:
 A() {}
 ~A() {}

 virtual void f() = 0;
 virtual void g() = 0;
};

// наследуемся от класса A
class B : public A {
public:
 B() {}
 ~B() {}

 virtual void f() override {
    cout << "B::f() was called." << endl;
 }

 virtual void g() override {
    cout << "B::g() was called." << endl;
 }

};

// наследуемся от класса A еще раз
class C : public A {
public:
 C() {}
 ~C() {}

 virtual void f() override {
    cout << "C::f() was called." << endl;
 }

 virtual void g() override {
    cout << "C::g() was called." << endl;
 }

};

Мы видим, что у нас есть два класса - B и C, которые имеют абсолютно одинаковую спецификацию, но при этом разную реализацию. Это будет полиморфизм.

Рассмотрим далее следующий пример:
Код:
abstract class A {
public:
 A() {}
 ~A() {}

 virtual void f() = 0;
 virtual void g() = 0;
};

// создаем некоторого наследника A
class B : public A {
public:
 B() {}
 ~B() {}

 virtual void f() override {
   cout << "f() was called." << endl;
 }

 virtual void g() override {
   cout << "g() was called." << endl;
 }

};

// и еще одного
class C : public A {
public:
 C() : m_B (new B()) {}
 ~C() { delete m_B; }

 virtual void f() override {
   m_B->f();
 }

 virtual void g() override {
   m_B->g();
 }

private:
 B *m_B;

};

В этом примере класс C формально предоставляет тот же интерфейс, что и класс B, но при этом непосредственную реализацию передает классу B, а не обеспечивает ее сам, как это было в примере с полиморфизмом. Таким образом, мы имеем делегирование.
45K
02 апреля 2011 года
botasa
45 / / 31.12.2010
спасибо ! не дадите автора книги по которой это прочитали, учили ?) книга Стивена Прата не плохая, но вижу там не очень раскрыта работа с КЛАСАМИ и вопше ООП ...
278
02 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: botasa
спасибо ! не дадите автора книги по которой это прочитали, учили ?) книга Стивена Прата не плохая, но вижу там не очень раскрыта работа с КЛАСАМИ и вопше ООП ...



Не дам, потому что сказать, что я это учил по какой-то одной книге, нельзя. :) Хотя в любом случае, единственный путь к полному владению C++ - это Страуструп в разных вариациях. Могу порекомендовать Буча, тоже очень хорошая книга в плане архитектуры и взаимодействия классов (Гради Буч, "Объектно-ориентированный анализ и программирование").

45K
02 апреля 2011 года
botasa
45 / / 31.12.2010
спасибо еще раз
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог