Тема: Принцип підстановки Лісков
Розмірковуючи про принцип підстановки Лісков, я прийшов до висновку, що відкрите наслідування базового класу, в якого є віртуальні методи (не чисто віртуальні), вже порушує цей принцип. До того ж неважливо, абстрактний клас чи ні. Ну і, звичайно ж, віртуального деструктора це не стосується.
Тобто проектуємо клас з поведінкою по-замовчуванню і маємо:
class Base {
public:
// метод, що порушує принцип підстановки Лісков
virtual void show() { std::cout << "default base class behaviour" << std::endl; }
virtual ~Base() {}
};
class Derived : public Base {
class someException{};
public:
void show();
};
void Derived::show() {
std::srand( time( 0 ) );
// приблизно в половині випадків може "щось піти не так"
if ( rand() % 2 == 0 ) {
std::cout << " -- here might be an exception" << std::endl;
// throw (new someException);
}
std::cout << "derived class behaviour" << std::endl;
}
int main( int argc, char **argv ) {
Base b;
Derived d;
b.show();
d.show();
return 0;
}
Також порушується принцип інверсії залежностей.
Тепер саме питання - я все правильно розумію?