Это будет работать, только если объявление теневого копирования public
.См. этот пример :
class Derived : public Base<Derived> {
private:
void f() { }
};
void x(Derived* d) {
d->g();
}
Вы получите:
<source>: In instantiation of 'void Base<T>::f() [with T = Derived]':
<source>:13:9: required from 'void Base<T>::g() [with T = Derived]'
<source>:23:10: required from here
<source>:8:9: error: 'void Derived::f()' is private within this context
static_cast<T*>(this)->f();
^~~~~~~~~~~
<source>:19:10: note: declared private here
void f() { }
^
Если функция не затенена в Derived
, вызов такой же, как this->Base<Derived>::f()
, что должно быть допустимо, поскольку Base
- единственный класс, который может получить к нему доступ.
Возможно также, что ваша путаница возникла из-за доступа к, казалось бы, другому объекту.Имейте в виду, что модификаторы доступа ограничивают доступ по области, а не по экземпляру.Любой метод, объявленный в Base
, может затронуть любого Base
частного члена экземпляра, а не только this
.