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

时间:2016-09-07 21:21:13

标签: c++ protected virtual-method

以下代码无法在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()更好的方法?

2 个答案:

答案 0 :(得分:1)

A* a = new A; a->f();

这是问题所在: 您无法从f()致电a,因为它不是public,并且在成员函数范围内无法访问B

<小时/> It Works!

答案 1 :(得分:1)

由于B从该类继承,因此不能在类的不同实例或父类的实例之间交叉调用受保护的方法。

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

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