无法在派生 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 ... */ }
};
以下代码无法在 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 ... */ }
};