#include <iostream>
using namespace std;
class Object
{
virtual void print() = 0;
};
class SingletonBase : public Object
{
private:
static SingletonBase* theOnlyTrueInstance;
protected:
SingletonBase()
{
if(!theOnlyTrueInstance)
theOnlyTrueInstance = this;
}
virtual ~SingletonBase(){}
public:
static SingletonBase* instance()
{
if (!theOnlyTrueInstance) initInstance();
return theOnlyTrueInstance;
}
void print()
{ cout<<"Singleton"<<endl; }
static void initInstance()
{ new SingletonBase; }
};
SingletonBase* SingletonBase::theOnlyTrueInstance = 0;
class OtherBase : public Object
{
public:
virtual string printSymbol() = 0;
void print()
{ cout<<printSymbol(); }
};
class SingletonChild : public SingletonBase , public OtherBase
{
public:
string printSymbol()
{
return "Test";
}
static void initInstance()
{ new SingletonChild; }
};
int main() {
SingletonChild::initInstance();
OtherBase* test = (OtherBase*)((SingletonChild*)SingletonChild::instance());
test->print();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgT2JqZWN0CnsKICAgIHZpcnR1YWwgdm9pZCBwcmludCgpID0gMDsKfTsKCmNsYXNzIFNpbmdsZXRvbkJhc2UgOiBwdWJsaWMgT2JqZWN0CnsKcHJpdmF0ZToKICAgIHN0YXRpYyBTaW5nbGV0b25CYXNlKiB0aGVPbmx5VHJ1ZUluc3RhbmNlOwpwcm90ZWN0ZWQ6CiAgICBTaW5nbGV0b25CYXNlKCkKICAgIHsKICAgICAgICBpZighdGhlT25seVRydWVJbnN0YW5jZSkKICAgICAgICAgICAgdGhlT25seVRydWVJbnN0YW5jZSA9IHRoaXM7CiAgICB9CiAgICB2aXJ0dWFsIH5TaW5nbGV0b25CYXNlKCl7fQpwdWJsaWM6CiAgICBzdGF0aWMgU2luZ2xldG9uQmFzZSogaW5zdGFuY2UoKQogICAgewogICAgICAgIGlmICghdGhlT25seVRydWVJbnN0YW5jZSkgaW5pdEluc3RhbmNlKCk7CiAgICAgICAgcmV0dXJuIHRoZU9ubHlUcnVlSW5zdGFuY2U7CiAgICB9CiAgICB2b2lkIHByaW50KCkKICAgIHsgY291dDw8IlNpbmdsZXRvbiI8PGVuZGw7IH0KICAgIHN0YXRpYyB2b2lkIGluaXRJbnN0YW5jZSgpCiAgICB7IG5ldyBTaW5nbGV0b25CYXNlOyB9Cn07CgpTaW5nbGV0b25CYXNlKiBTaW5nbGV0b25CYXNlOjp0aGVPbmx5VHJ1ZUluc3RhbmNlID0gMDsKCmNsYXNzIE90aGVyQmFzZSA6IHB1YmxpYyBPYmplY3QKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHN0cmluZyBwcmludFN5bWJvbCgpID0gMDsKICAgIHZvaWQgcHJpbnQoKQogICAgeyBjb3V0PDxwcmludFN5bWJvbCgpOyB9Cn07CgpjbGFzcyBTaW5nbGV0b25DaGlsZCA6IHB1YmxpYyBTaW5nbGV0b25CYXNlICwgcHVibGljIE90aGVyQmFzZQp7CnB1YmxpYzoKICAgIHN0cmluZyBwcmludFN5bWJvbCgpCiAgICB7CiAgICAgICAgcmV0dXJuICJUZXN0IjsKICAgIH0KICAgIHN0YXRpYyB2b2lkIGluaXRJbnN0YW5jZSgpCiAgICB7IG5ldyBTaW5nbGV0b25DaGlsZDsgfQp9OwoKaW50IG1haW4oKSB7CiAgICBTaW5nbGV0b25DaGlsZDo6aW5pdEluc3RhbmNlKCk7CiAgICBPdGhlckJhc2UqIHRlc3QgPSAoT3RoZXJCYXNlKikoKFNpbmdsZXRvbkNoaWxkKilTaW5nbGV0b25DaGlsZDo6aW5zdGFuY2UoKSk7CiAgICB0ZXN0LT5wcmludCgpOwogICAgcmV0dXJuIDA7Cn0=