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

Xle*_*lea 2 c++ casting explicit

假设A源自B. B *x = new A()例如,是否有一种方法可以通过进行必要的显式强制转换来禁止像 中那样的隐式向上强制转换?

Mik*_*our 5

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

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

B * x = new A();   // not allowed
A * a = new A();   // OK
B * b = a->to_B(); // OK
Run Code Online (Sandbox Code Playgroud)

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