无法在派生 class 中调用虚拟保护方法

Can't call virtual protected method in derived class

以下代码无法在 GCC 4.9.1 中编译:

class A
{
protected:
   virtual void f() {}

};

class B : public A
{
protected:
   virtual void f() override { A* a = new A; a->f(); }
};

我得到以下信息:

header.h: In member function 'virtual void B::f()':
header.h:51:17: error: 'virtual void A::f()' is protected

我本以为可以编译。

为什么会失败?有没有比制作 f() public?

更好的方法
A* a = new A; a->f();

问题出在这里: 您不能从 a 调用 f(),因为它不是 public,并且在成员函数范围内 B 不可访问。


It Works!

您不能 交叉调用 受保护的方法 class 或父 class 的不同实例之间只是因为 B 继承来自 class.

无论如何 B 已经是 A
您打算打电话给 A::f(); 吗?

class B : public A {
protected:
    virtual void f() override { A::f(); /* ... whatever ... */ }
};