【发布时间】:2015-02-16 09:02:53
【问题描述】:
我有一个从 A 公开继承的 B 类:
class A {
private:
virtual void method();
}
class B : public A {
private:
void method();
}
现在,我需要以某种方式在 B::method() 中调用原始的 A::method(),而不调用 A 的复制构造函数。
A 在我试图扩展的库中定义,因此我无法更改此代码(例如,使方法受保护)。是否有可能以某种方式在B::method() 中投射this ptr 并切掉覆盖的method?
我正在使用调用A::method() 的外部接口。此接口正确调用了我重写的B::method(),但我似乎无法使B::method() 内的接口调用不产生堆栈溢出。
【问题讨论】:
-
另见stackoverflow.com/questions/2170688/private-virtual-method-in-c,这表明
A类的作者正试图防止这种情况发生。 -
我认为您所提出的方法只会遇到问题。 1. 可能不是虚拟的 2. 可能没有虚拟析构函数 3. 开发人员不打算在其实现之外重写或调用此方法(因此是私有的且不受保护)。看起来您正在尝试做一些他们不打算发生的事情。
-
@cdhowie:它们可以是
private,它们仍然可以被覆盖。如果不是因为很少需要调用基本版本来对其进行一些操作,那将是一个合理的习惯用法(有一段时间我主张让所有virtual函数private但我意识到这是错误:他们应该是protected)。 -
@DietmarKühl 是的,受保护的虚拟是我一直为不应该公开的虚拟方法所做的。尽管如此,很高兴知道私有虚拟选项存在(尽管我可能不会充分使用它)。
-
这是一个标志
method()不应该被子类显式调用;这样做可能会破坏对象的状态(这很糟糕)!如果您认为method()实际上应该受到保护,我会联系图书馆供应商和/或自己更改源,如果您可以使用的话。
标签: c++ casting virtual base derived-class