#include class parent { public: template class operators { public: operators() { const parent* parent_this = dynamic_cast(dynamic_cast(this)); // make sure this is derived from parent as well assert(parent_this); } virtual ~operators() { }; C operator-(){ C ret; ret.asdf = static_cast(static_cast(this))->asdf * -1; return ret; } }; public: int asdf; virtual ~parent() { }; }; class A : public parent, public parent::operators { public: virtual ~A() { }; }; class B : public parent::operators { };