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

Is mandatory explicit upcasting possible in C++

本文关键字:转换 C++ 是否      更新时间:2023-10-16

假设A派生自B .有没有办法禁止像B *x = new A()中的隐式上转换,例如,通过强制要求显式转换?

没有办法完全阻止这种转换。

您可以在大多数地方(但不是在朋友或A的成员中(使用私有继承来阻止它,或者通过将继承替换为包含或聚合关系(其中A包含B的实例或指针/引用,而不是继承(。然后,成员函数可以模拟显式强制转换:

B * x = new A();   // not allowed
A * a = new A();   // OK
B * b = a->to_B(); // OK

但是你应该考虑一下你真正想要防止什么行为,而不是让一个完全正常的操作需要跳过一个相当奇怪的箍。几乎可以肯定有更好的方法来解决您的特定问题。

这是不可能的,也违背了多态性规则。由于 A 派生自 B,因此 A 是 B。所以不需要演员,B是A的母班。A 的任何实例都可以更改为 B 的实例。

这基本上是你想要的,因为它允许对接口进行编程。通常接口,虽然接口在C++中不存在,是通过某种抽象类定义的。如果您能够继续引用接口并远离某个接口的实际实现,则代码通常处于更好的状态。

你可以为此创建一个包装类,如下所示:

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

现场示例