1) single responsibility principle.
2) Liskov substitution principle.
functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
3) dependence inversion principle.
high level modules should not depend upon low level modules. both should depend upon abstractions.
abstractions should not depends upon details.
details should depends upon abstrations.
4) Interface segragation principle.
client should not beforced to depend upon interfaces that they don't use.
5) composite reuse principle
least knowledge principle( only talk to your immediate friends )
6) open-close principle
software entities like classes, modules and functions should be open for extension but close for modifications.