gpt4 book ai didi

c++ - 取消删除设计不良的已删除 C++ 函数

转载 作者:行者123 更新时间:2023-11-27 22:58:25 25 4
gpt4 key购买 nike

由于接口(interface)设计失误,第三方软件商删除了一个函数,比如base_noncopy_base类中的拷贝构造函数:

class base_noncopy_base {
base_noncopy_base(const base_noncopy_base&);
public:
base_noncopy_base() {}
};

那个类应该是继承的,比如:

class base_noncopy_derived : public base_noncopy_base {
// whatever ....
};

但是现在,不再允许使用 base_noncopy_derived 作为 base_noncopy_base:

int main() {
base_noncopy_derived d;
// base_noncopy_base b1 = d; // won't compile
// base_noncopy_base b2(d); // won't compile
// base_noncopy_base b3((base_noncopy_derived)d); // won't compile
}

const_cast 一个 const 成员是可能的,而且我已经看到一些 hack 可以从类外部访问私有(private)成员,当然,仅供使用在紧急情况下。我想知道:是否有可能破解删除函数?

编辑 1:

进一步阐述问题:

实际问题来自其他第三方函数函数,如:

void base_noncopy_function1(base_noncopy_base &b) {
}

void base_noncopy_function2(base_noncopy_base b) {

我可以使用类似的东西:

base_noncopy_base *b4 = &d;
base_noncopy_function1(*b4);

但不是

base_noncopy_function2(*b4);

最佳答案

如果您想“将 base_noncopy_derived 用作 base_noncopy_base”,则使用引用或指针而不是创建新对象:

base_noncopy_derived d;
base_noncopy_base & b = d;

您注释掉的代码试图分割基类,通过仅复制 d 的一部分来创建一个新对象。这很少是一件明智的事情,也是基类往往是抽象的或不可复制的原因。

如果你真的想这样做,那么你必须改 rebase 类的定义,这样它就不会删除复制函数。无法“取消删除”它们。

关于c++ - 取消删除设计不良的已删除 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30219664/

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