Single-responsiblity Principle
Open-closed Principle
Liskov Substitution Principle
Subclasses should be substitutable for their base classes.
Given that class B is a subclass of class A, we should be able to pass an instance of class B to any method that expects an instance of class A and the method should not give any weird output in that case.
So in terms of functionality, subclass B should be a superset of superclass A.
Example
Although in math, Square is a special case of Rectangle, letting Square class inherit Rectangle class violates Liskov Substitution Principle.
Square cannot replace Rectangle as its width and height are set together.