C ++ Вызов закрытой / защищенной функции общего базового класса. - PullRequest
3 голосов
/ 19 декабря 2010

Есть ли хороший способ для звонка A::foo() из B::bar() в следующем примере?

class A {
protected:
  void foo() {}
};

class B : public A {
public:
  void bar(A& a) { // edit: called with &a != this
    a.foo(); // does not work
  }
};

Я не могу думать ни о чем, кроме как объявить B своим другом A, но это может быть довольно уродливо с некоторыми другими классами.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 20 декабря 2010

Да, вы можете использовать функцию базового класса.

class A {
protected:
  void foo() {}
  void do_other_foo(A& ref) {
      ref.foo();
  }
};

class B : public A {
public:
  void bar(A& a) { // edit: called with &a != this
    this->do_other_foo(a);
  }
};
3 голосов
/ 19 декабря 2010

Почему вы передаете объект типа A?Вы можете сделать так:

class B : public A {
public:
  void bar() {
    foo();
  }
};

или, как это

1 голос
/ 24 июня 2012

Вот подход к предоставлению «защищенного» аналогичного доступа, позволяющего вызывать любые производные классы или объекты.Он использует защищенный тип токена, необходимый для разблокировки привилегированных методов:

struct A
{
protected:
    //Zero sized struct which allows only derived classes to call privileged methods
    struct DerivedOnlyAccessToken{};

public:     //public in the normal sense :
    void foo() {}

public:     //For derived types only :
    void privilegedStuff( DerivedOnlyAccessToken aKey );
};

struct B: A
{
    void doPrivelegedStuff( A& a )
    {
        //Can create a token here
        a.privilegedStuff( DerivedOnlyAccessToken() );
    }
};

int _tmain(int argc, _TCHAR* argv[])
{

    A a;
    a.foo();
    a.privilegedStuff( A::DerivedOnlyAccessToken() ); // compile error.

    B b;
    b.doPrivelegedStuff( a );

    return 0;
}

Это не моя идея.Я прочитал это в каком-то месте.Извините, я не помню, какая это была хитрая идея.

Я ожидаю, что компилятор может исключить параметр aKey.

...