I am experiencing a curious case of Object slicing. I am working on project where I need singleton classes so my Base and derived class both are singleton. Following sample case describes my situation.
This is my Base class
// Base.h
class Base
{
public:
static Base& base;
virtual void doSomething(){ cout<<"Base Do Something"<<endl; }
protected:
Base();
virtual ~Base();
static Base& getBaseInstance();
private:
};
//Base.cpp
Base::Base()
{
//ctor
}
Base::~Base()
{
//dtor
}
Base& Base::getBaseInstance()
{
static Base object;
return object;
}
Base& Base::base=Base::getBaseInstance();
This is my Derived Class
class Derived: public Base
{
public:
static Derived& derived;
virtual void doSomething(){ cout<<"Derive Do Something"<<endl; }
static Derived& getDerivedInstance();
protected:
Derived();
virtual ~Derived();
private:
};
Derived::Derived()
{
//ctor
}
Derived::~Derived()
{
//dtor
}
Derived& Derived::derived=Derived::getDerivedInstance();
Derived& Derived::getDerivedInstance()
{
static Derived object;
return object;
}
And finally this is my main Function
int main()
{
cout << "Hello world!" << endl;
Base::base.doSomething();
Derived::derived.doSomething();
Base::base=Derived::derived;
Base::base.doSomething();
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
Base& r = Derived::derived;
r.doSomething();
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
return 0;
}
And I am getting following output for this
Hello world!
Base Do Something
Derive Do Something
Base Do Something
Base Do Something
Derive Do Something
Base Do Something
So my question is since object slicing should not work on references, then why I am not able to overwrite Base::base
reference I created as static data member of Base class with Derived object? While this works fine on Base& r = Derived::derived;
I mean when I call do something with r.doSomething()
I get doSomething of Derived class. But this is not so with
Base::base=Derived::derived;
Base::base.doSomething();
or
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
Any sort of clarification will be appreciated. Thank You.