首页 > 解决方案 > 抽象基类中私有虚函数的可见性

问题描述

考虑以下代码:

class A {
public:
  virtual void f() const = 0;
  void callf() const { f(); }
};

class B : public A {
  virtual void f() const { }
};

int main()
{
  B x;
  x.callf();

  return 0;
}

B派生自抽象基类A,但将实现的方法“隐藏”f()为私有成员。尽管如此,继承的成员callf()仍然可以调用f()在基类中是公共的。该代码在 g++ 10.1.0 和 clang++ 11.1.0 上编译时没有警告。

这是一个法律代码,即继承者callf()是否正确看到了私有成员f()

或者,派生类是否有可能B实现基类的纯虚方法,这样它们只能由B(和朋友)调用?

标签: c++inheritancelanguage-lawyervirtual-functions

解决方案


这是一个合法的代码,即继承的 callf() 是否正确地看到了私有成员 f()?

是的,这是合法的代码。从编译器的角度来看,callf函数引用了它自己的类的f函数;这是一个虚函数这一事实不会影响范围(或可访问性)——只影响实现,它将以调用 v-table 条目的形式出现。该 v-table 条目将在运行时正确解释,当它通过派生类调用时。


推荐阅读