Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и
От: rg45 СССР  
Дата: 01.09.25 10:08
Оценка:
Здравствуйте, so5team, Вы писали:

S>Что до желания обсудить настоящесть ООП, предлагаю рассмотреть реализацию такого примера (псевдокод в синтаксисе a la C++, но на C++ это не реализуется):

S> . . .

Обходится добавлением пары промежуточных классов в иерархию наследования (если по каким-то причинам нам недоступно переименование методов в базовых классах).

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

http://coliru.stacked-crooked.com/a/a2a51e9929bb5286

#include <iostream>

struct A {
  virtual void f() { std::cout << "A::f" << std::endl; }
};

struct B {
  virtual void f() { std::cout << "B::f" << std::endl; }
};

void consume_A(A & o) { o.f(); /* Здесь вызывается f из A */ }

void consume_B(B & o) { o.f(); /* Здесь вызывается f из B */ }

struct A_Adaptor : A {
  virtual void f_a() = 0;
  void f() override { f_a(); }
};

struct B_Adaptor : B {
  virtual void f_b() = 0;
  void f() override { f_b(); }
};

struct D : A_Adaptor, B_Adaptor
{
  void f_a() override {
    std::cout << "D's f from A" << std::endl;
    A::f();
  }
  void f_b() override {
    std::cout << "D's f from B" << std::endl;
    B::f();
  }
};

int main() {
  D d;
  consume_A(d);
  consume_B(d);
}

D's f from A
A::f
D's f from B
B::f
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 01.09.2025 10:32 rg45 . Предыдущая версия . Еще …
Отредактировано 01.09.2025 10:19 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.