The singleton pattern has come a long way since early 1990x. The programmer interview question "Write a singleton" in 1995 has evolved to "Write a lazy initialized singleton" in 2000x, and finished by "Why we do not use a singleton?" in 2010x.
Indeed, the unproved using of multiple singletons should be considered as antipattern. However, we still need singletons in some cases.
Do not use static_cast when you cast from a basic class to a derived one. This may lead to undefined behavior. To handle the polymorphism, a virtual inheritance or a multiple inheritance case always use dynamic_cast instead.
The following short example shows the undefined behavior cases. This works with GCC, VC and online C++ shells: