如何从派生类到基类ptr访问受保护的基类函数

use*_*508 1 c++ protected derived-class

我有抽象类A,从中继承了许多类.在派生类中,我试图访问A槽A指针中的受保护函数.但是我收到编译器错误.

class A
{
   protected:
        virtual  void f()=0;
};

class D : public A
{
    public:
         D(A* aa) :mAPtr(aa){}
         void g();

    protected:
         virtual void f();

    private:
      A* mAPtr; // ptr shows to some derived class instance
};

void D::f(){  }


void D::g()
{
   mAPtr->f();
}
Run Code Online (Sandbox Code Playgroud)

编译器错误说:无法访问A类中声明的受保护成员A :: f.

如果我声明mAPtr是D*,而不是A*所有编译.我不明白为什么会这样.

Lig*_*ica 6

依赖private访问适用于相同类型的不相关实例.

依赖protected访问适用于相同类型(以及更多派生类型)的不相关实例.

然而,依靠protected访问并没有在基本类型的实例无关的工作.

[n3290: 11.5/1]: 派生类朋友或成员函数引用受保护的非静态成员函数或受保护的基类的非静态数据成员,除了在第11节中描述的那些之外,还应用访问检查.除非形成指向成员的指针(5.3) .1),访问必须通过指向,引用或派生类本身的对象(或从该类派生的任何类)(5.2.5).如果访问要形成指向成员的指针,则嵌套名称说明符应命名派生类(或从该类派生的任何类).

所以D或者某些东西D,但不是A.

这是一个经常被人质疑的关于C++的可爱奇怪,尽管如此,它仍然是为了避免陷阱而设计的.毕竟,你不知道*mAPtr 真正的类型.