如何防止基 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
接口以某种方式确定 *pB
是 D
,但那将是一些特定于 B
的冗长代码和 D
.
假设基础 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
接口以某种方式确定 *pB
是 D
,但那将是一些特定于 B
的冗长代码和 D
.