class Base
{
public:
virtual void func() const
{
cout<<\"This is constant base \"<
virtual void func()
is actually of a different signature than virtual void func() const
. Thus you didn't override your original, read-only base function. You ended up creating a new virtual function instead in Derived.
You can also learn more about this if you ever try to create pointers to member functions (PTMFs), but that's a rare necessity (might be good for study or practice, however).
The override keyword in C++11 is particularly handy to help avoid these kinds of mistakes. The compiler would then tell you that your definition of 'func' in derived does not override anything.