c++ - 访问 protected 方法的方法指针?

标签 c++ protected specifications

这段代码:

class B {
 protected:
  void Foo(){}
}

class D : public B {
 public:
  void Baz() {
    Foo();
  }
  void Bar() {
    printf("%x\n", &B::Foo);
  }
}

给出这个错误:

t.cpp: In member function 'void D::Bar()':
Line 3: error: 'void B::Foo()' is protected
  • 为什么我可以调用 protected 方法,但不能获取其地址?
  • 有没有办法标记可以从派生类完全访问的东西,而不是只能从派生类与所述派生类相关?

顺便说一句:This looks related但我正在寻找一个引用,以说明在规范等中调用它的位置(希望这将导致如何让事情按我期望的方式工作)。

最佳答案

您可以通过D获取地址通过写 &D::Foo , 而不是 &B::Foo .

看到这个编译正常:http://www.ideone.com/22bM4

但这不能编译(你的代码):http://www.ideone.com/OpxUy


为什么我可以调用 protected 方法但不能获取其地址?

你不能通过写 &B::Foo 来获取它的地址因为Foo protected 成员,您无法从外部访问它B ,甚至没有它的地址。但是写 &D::Foo ,你可以,因为 Foo成为 D 的成员通过继承,你可以得到它的地址,无论它是私有(private)的、 protected 还是公共(public)的。

&B::Foob.Foo() 具有相同的限制和 pB->Foo()有,在以下代码中:

void Bar() {
    B b;
    b.Foo();     //error - cannot access protected member!
    B *pB = this;
    pB->Foo();   //error - cannot access protected member!
  }

在 ideone 看到错误:http://www.ideone.com/P26JT

关于c++ - 访问 protected 方法的方法指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5822421/

相关文章:

c++ - CMake 和 Qt : directory for moc files/clean rules

c++ - 程序的参数格式有没有标准?

java - JPA 与规范 - 如何通过子集合内容过滤实体?

c++ - 采用 C++11 的 Google v8 引擎

C++ MP3、WAV 和 AAC(低级)解码器?

c++ - 如何从指向结构的指针输出char数组中的整个字符串

java - protected 和没有访问修饰符之间的区别

子类中的 Java 静态构造函数访问

c++ - 将对象转换为派生类以访问父类的 protected 成员

http - HTTP 字段名称 Referer 的拼写错误是故意的吗?