gpt4 book ai didi

c++ - 通过类型转换切掉重写的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:46 25 4
gpt4 key购买 nike

我有一个公开继承自 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com