Bar*_*lin 5 c++ virtual casting base derived-class
我有一个从A公开继承的B级:
class A {
private:
virtual void method();
}
class B : public A {
private:
void method();
}
Run Code Online (Sandbox Code Playgroud)
现在,我需要以某种方式调用原来的A::method()内B::method(),而无需调用为A的拷贝构造函数
在图书馆,我想扩展定义A,所以我不能改变这个代码(使法保护的例子).是否有可能以某种方式将thisptr 投射B::method()到被覆盖的内部并切掉method?
我正在使用一个调用的外部接口A::method().这个接口正确调用我的重写B::method(),但我似乎无法使接口调用内部B::method()不生成堆栈溢出.
由于private方法不能被称为合格的并且覆盖不能被撤消,因此您将无法在private没有另一个对象的情况下调用该方法。转换对象不会产生任何效果,因为处理虚函数的方式是实际对象的一部分。
过去我曾主张创建所有 virtual函数(析构函数除外)private,但调用基类版本的需要实际上并不罕见。因此,virtual函数不应该是private,而应该是protected。当然,如果一个界面确实实现了它的virtual功能private,那么这个界面的用户就无法挽回设计错误。
看到提倡可怕黑客 () 的答案#define private protected得到了支持,我建议宁愿依赖virtual添加的非成员函数而不更改对象布局,并编辑头文件以添加合适的函数:
class A {
private:
virtual void method();
protected:
void call_method() { this->A::method(); }
};
Run Code Online (Sandbox Code Playgroud)
这种变化具有更多的局部影响,而且不可移植。virtual然而,它仅依赖于不通过添加非( inline) 方法和访问说明符来更改对象布局。语言级别的警告不会受到影响。