假设A
来自B
。例如,有没有办法禁止像B *x = new A()
中的隐式向上转换那样通过进行必要的显式转换?
答案 0 :(得分:4)
没有办法完全阻止这种转换。
您可以使用私有继承在大多数地方(但不在朋友或A
成员中)阻止它,或者使用包含或聚合关系替换继承(其中A
包含实例或指针/引用B
,而不是继承)。然后成员函数可以模拟显式转换:
B * x = new A(); // not allowed
A * a = new A(); // OK
B * b = a->to_B(); // OK
但是你应该考虑一下你真正想要防止的行为,而不是做一个完全正常的操作需要跳过一个相当奇怪的箍。几乎可以肯定有更好的方法来解决您的具体问题。
答案 1 :(得分:2)
这是不可能的,也违反了多态的规则。 由于A来自B,A是B.所以不需要强制转换,B是A的母类.A的任何实例都可以更改为B的实例。
这就是你想要的,因为它允许对接口进行编程。 通常,接口虽然在C ++中不存在接口,但是通过某种抽象类定义。如果您能够继续引用接口并远离特定接口的实际实现,则代码通常会处于更好的状态。
答案 2 :(得分:0)
您可以为此创建一个包装类,如:
template<typename T>
class MyPtr
{
public:
MyPtr(T* t) : t(t) {}
template <typename U>
MyPtr(U*) = delete;
MyPtr operator = (T* t) { this->t = t; return *this; }
template <typename U>
MyPtr operator = (U* t) = delete;
operator T* () const { return t; }
private:
T* t;
};