在C++中是否可以强制显式向上转换
Is mandatory explicit upcasting possible in C++
假设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;
};
现场示例
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++