- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个公开继承自 A 的 B 类:
class A {
private:
virtual void method();
}
class B : public A {
private:
void method();
}
现在,我需要以某种方式在 B::method()
中调用原始的 A::method()
,而不调用 A 的复制构造函数。
A 是在我试图扩展的库中定义的,因此我无法更改此代码(例如使方法 protected )。是否有可能以某种方式在 B::method()
中转换 this
ptr 并切掉覆盖的 method
?
我正在使用调用 A::method()
的外部接口(interface)。此接口(interface)正确调用了我重写的 B::method()
,但我似乎无法在 B::method()
中进行接口(interface)调用而不产生堆栈溢出.
最佳答案
因为 private
方法不能被限定调用并且覆盖不能被撤销,你将不能在没有另一个对象的情况下调用 private
方法。转换对象不会有任何影响,因为处理虚函数的方式是实际对象的一部分。
过去我提倡让所有 virtual
函数(析构函数除外)private
但需要调用基类版本实际上并不少见。因此,virtual
函数应该不是private
,而是protected
。当然,如果接口(interface)实际上将其虚拟
函数设为私有(private)
,则该接口(interface)的用户无法撤消设计错误。
看到提倡可怕的黑客攻击(#define private protected
)的答案获得赞成票,我建议宁可依靠添加非虚拟
成员函数而不改变对象布局并编辑头文件以添加合适的函数:
class A {
private:
virtual void method();
protected:
void call_method() { this->A::method(); }
};
此更改具有更多本地效果,而且不可移植。但是,它仅依赖于不通过添加非虚拟
(inline
) 方法和访问说明符来更改对象布局。语言级别的警告不会受到影响。
关于c++ - 通过类型转换切掉重写的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27531954/
我是一名优秀的程序员,十分优秀!