取消删除糟糕设计的已删除C ++函数

时间:2015-05-13 15:46:53

标签: c++ copy-constructor

由于设计接口时出错,第三方软件提供商删除了一个函数,如类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成员,我看到一些黑客可以从课外访问私人成员,当然,仅用于紧急情况。我想知道:有没有可能黑客删除一个功能?

编辑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);

1 个答案:

答案 0 :(得分:4)

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

base_noncopy_derived d;
base_noncopy_base & b = d;

您的注释掉的代码尝试对基类进行切片,通过仅复制d的一部分来创建新对象。这很少是一件明智的事情,也就是基类倾向于抽象或不可复制的原因。

如果您真的想这样做,那么您将不得不更改基类的定义,以便它不会删除复制功能。没有办法“取消删除”它们。