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;
}
};
C++ делегирование и полиморфизм
про полиморфизм понимаю немного ... это например конструктор, констурктор копирования, конструктор по дефолту (1 имя разные сигнатуры ) а про делегирование 1-й раз слышу или не понимаю ...
В чем разница между делегированием и полиморфизмом? Привести пример и на примере объяснить особенности применения каждого из типов организации связи между классами.
Код:
Мы видим, что у нас есть два класса - 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;
};
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, а не обеспечивает ее сам, как это было в примере с полиморфизмом. Таким образом, мы имеем делегирование.
спасибо ! не дадите автора книги по которой это прочитали, учили ?) книга Стивена Прата не плохая, но вижу там не очень раскрыта работа с КЛАСАМИ и вопше ООП ...
Цитата: botasa
спасибо ! не дадите автора книги по которой это прочитали, учили ?) книга Стивена Прата не плохая, но вижу там не очень раскрыта работа с КЛАСАМИ и вопше ООП ...
Не дам, потому что сказать, что я это учил по какой-то одной книге, нельзя. :) Хотя в любом случае, единственный путь к полному владению C++ - это Страуструп в разных вариациях. Могу порекомендовать Буча, тоже очень хорошая книга в плане архитектуры и взаимодействия классов (Гради Буч, "Объектно-ориентированный анализ и программирование").
спасибо еще раз