template<class D>
struct X {
A* self(){ return static_cast<D*>(this); }
A const* self() const{ return static_cast<D*>(this); }
void foo(){
self()->f( 1, 2, 3 );
}
};
struct XA: A, X<XA> {};
struct XB: B, X<XB> {};
В пределах X<XB>
, реализация XB
, у вас есть доступ только к A
.
Если вы хотите, чтобы пользователи видели только A
, выставляйте XB
s как A
.
Обратите внимание, что это может быть совершенно бесполезно, поскольку для доступа к любым изменениям в XB
/ X<XB>
необходимо знать, что ваш объект не является A
, поскольку X<XB>
ничего не изменяет в интерфейсе A
.