Информация об изменениях

Сообщение Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и от 01.09.2025 10:08

Изменено 01.09.2025 10:32 rg45

Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и
Здравствуйте, 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
Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и
Здравствуйте, 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