Доступ к базовому закрытому методу c ++ возможен после приведения его к производному классу? - PullRequest
0 голосов
/ 21 сентября 2018

Я нашел это, когда использовал CRTP (любопытно повторяющийся шаблон).

template <typename T>
class Base {
private:
    void f() {
        //when T has its own f(), it calls that
        //when T doesn't have, it calls itself, which is invoked recursively
        //but i expect the compiler to complain that f() is private when T doesn't have its own f()
        static_cast<T*>(this)->f();
    }

public:
    void g() {
        f();
    }
};

class Derived : public Base<Derived> {};

Я думал, что понимаю public, protected и private, но для этого случая это выглядит, как будто я ошибаюсь.Любое объяснение приветствуется!

1 Ответ

0 голосов
/ 21 сентября 2018

Это будет работать, только если объявление теневого копирования 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.

...