在C ++中是否可以强制显式向上转换

时间:2015-03-23 15:52:08

标签: c++ casting explicit

假设A来自B。例如,有没有办法禁止像B *x = new A()中的隐式向上转换那样通过进行必要的显式转换?

3 个答案:

答案 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;
};

Live example