由于设计接口时出错,第三方软件提供商删除了一个函数,如类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);
答案 0 :(得分:4)
如果您想“将base_noncopy_derived
用作base_noncopy_base
”,请使用引用或指针而不是创建新对象:
base_noncopy_derived d;
base_noncopy_base & b = d;
您的注释掉的代码尝试对基类进行切片,通过仅复制d
的一部分来创建新对象。这很少是一件明智的事情,也就是基类倾向于抽象或不可复制的原因。
如果您真的想这样做,那么您将不得不更改基类的定义,以便它不会删除复制功能。没有办法“取消删除”它们。