Здравствуйте, Shmj, Вы писали:
S>Вот оно как: https://habr.com/ru/articles/942582/
S>И автор говорит что настоящий ООП — был только в Smalltalk.
Судя по содержанию статьи автор "врет как очевидец", т.к. по моим воспоминаниям, IBM со своим OS/2 проиграла MS и Windows задолго до того, как автор статьи первый раз столкнулся с OS/2.
Что до желания обсудить настоящесть ООП, предлагаю рассмотреть реализацию такого примера (псевдокод в синтаксисе a la C++, но на C++ это не реализуется):
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 */ }
struc D : public A, public B
{
void f() override A::f {
std::cout << "D's f from A" << std::endl;
A::f();
}
void f() override B::f {
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
ИМХО, ОО-язык, который не позволяет получить такой эффект, настоящим не является, т.к. не позволяет использовать возможности полноценного наследования (включая множественного) в полной мере. Соответственно, таковыми не являются ни SmallTalk, ни C++, ни Java...