First of all, it's not brackets, but braces.
All scopes have braces. But some scopes are more special than others. A function is an entire scope. In this case:
CNullDecorator(){}
This declares an empty constructor, a constructor with no code. Normally, you'll have a constructor doing something:
CNullDecorator()
{
// Some code here. Initialize this to that. Call some other
// function
}
Pretend that there's code inside the braces. Now you have a typical constructor. But nothing actually requires you to have any code in the constructor. So, if you leave it out, you'll have an empty set of braces.
This doesn't really do anything useful. You can leave out the constructor entirely, and the compiler will happily supply it to you. It's a matter of style.
On the other hand, there is a reason why the destructor is the way it is:
virtual ~CNullDecorator(){}
This also declares a destructor that's empty, and contains no code.
But in this case, there's a reason for this. Like with a constructor, if you leave out the destructor completely, the compiler will supply a default destructor.
But this declaration does something a little bit more: it declares a virtual destructor.
In this case, all this class needed is a virtual destructor. The virtual destructor didn't need to do anything explicit, hence its contents were empty. But, the class required a virtual destructor, so it had to be declared.