如何防止基 class 指针下的派生 class 对象调用基 class 中定义但在派生中被覆盖的 public 非虚函数?

How to prevent a derived class object under base class pointer calling a public nonvirtual function defined in base class but overridden in derived?

假设基础 class B 有一个非虚拟的 public 函数 f() ,不幸的是它被派生的 class D 覆盖了。

然后有一个 D 对象 d 传递给一个 B 指针 pB

有没有办法阻止调用 pB->f()

如果您可以更改 B,您可以将 f 设为虚拟,或将其转发到受保护的虚拟 do_f,或其他各种操作。

如果你不能改变B,你就不能阻止它的public方法被调用,你也不能以某种方式拦截对非虚拟基础的调用class方法。

你的问题本质上是问,“我如何使函数成为虚拟的?”你没有给出为什么你不能这样做的原因,但也许你不能改变 B.

的声明

如果 B 至少有一个虚函数,您可以使用 RTTI 检查 *pB 是否真的是 D,如果是,则将其转换为 D&。你不能让现有的代码使用 B* 这样做;如果您的女儿 class 在您将其称为 B 时中断,它会破坏该接口的契约。

否则,可以通过调用 B 接口以某种方式确定 *pBD,但那将是一些特定于 B 的冗长代码和 D.