【问题标题】:Visibility of private virtual function in abstract base classes抽象基类中私有虚函数的可见性
【发布时间】:2021-09-26 23:29:23
【问题描述】:

考虑以下代码:

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(和朋友)调用?

【问题讨论】:

  • 你想要一个不允许基类调用的派生类函数?这不是违反里氏替换原则吗?
  • 不确定你的最后一句话/问题是什么意思。在您展示的代码中,派生类B确实实现了基类的纯虚方法。
  • 我的建议是强制基类完全抽象(删除),因此行为由派生类定义。
  • @LouisGo 是的,我希望基类方法不能调用 f()。
  • 另一个answer同样的问题可能也有帮助。

标签: c++ inheritance language-lawyer virtual-functions


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 2023-03-23
    • 2015-11-04
    • 1970-01-01
    • 2011-03-21
    • 2019-04-20
    • 2012-07-22
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多