Nie dowiedziałeś się za wiele skoro pytasz dalej o podstawy programowania obiektowego w c++. Modyfikator "protected" powoduje, że składowe danej klasy są niedostępne spod jawnie utworzonej instancji klasy ( czyli obiektu ), są one natomiast dostępne w klasie pochodnej ( w mechanizmie dziedziczenia również tworzona jest instancja klasy bazowej jednak bez twojej ingerencji dlatego napisałem "jawnie utworzonej" ). Czyli zasada działania jest taka, że nie masz do nich dostępu poza drogą dziedziczenia.
paintEvent jest metodą wirtualną dostępną z QWidget. Reimplementacja metody wirtualnej to jest nic innego jak nadpisanie jej funkcjonalności jednak wywoływana jest nadal w tym samym kontekście. W innych językach programowania możesz sterować tym przebiegiem czyli możesz daną metodę wirtualną przesłonić albo nadpisać, czyli możesz mieć jakby jej dwie wersję. W c++ reimplementując funkcję wirtualną nadpisujesz tą odziedziczoną lecz tylko na tym poziomie dziedziczenia, na którym się znajduje i taką ją wywołujesz.
PS
QToolButton może posiadać swojego rodzica warto to zaimplementować w klasie pochodnej czyli:
class MyToolButton : public QToolButton
{
public:
MyToolButton( QWidget*=0 );
};
MyToolButton::MyToolButton( QWidget *parent ) : QToolButton( parent ) {}
W deklaracji klasy, którą ty zamieściłeś w ostatnim poście brakuje ci deklaracji "void paintEvent(QPaintEvent * event)".