如何在c++中防止这种类型的强制转换?
How can I prevent this kind of casting in c++
假设有两个这样的类
class Locator
{
public:
// this goes to the specified latitide and longitude
bool GoToLocation(long lat, long longtd);
};
class HouseLocator : private Locator
{
public:
// this internally uses GoToLocation() after fetching the location from address map
bool GoToAddress(char *p);
}
我使用私有继承来阻止HouseLocator上的GoToLocation(),因为它在那里没有意义,并且强制人们使用适当的接口。
现在我的问题是,如何防止这种类型的强制转换?
HouseLocator *phl = new HouseLocator;
Locator *pl = (Locator*)phl;
pl->GoToLocation(10, 10);
我应该在文档中不这样做,把剩下的留给用户吗?我的意思是,如果他铸错了,那是他的问题?
用组合代替继承:
class Locator
{
public:
bool GoToLocation(long lat, long longtd);
};
class HouseLocator
{
Locator locator_;
public:
// internally uses locator_.GoToLocation()
bool GoToAddress(char *p);
};
如果由于某些原因不实际,那么使用private
继承是您最好的选择——如果用户将HouseLocator*
强制转换为Locator*
,他们将调用未定义行为,这是他们的问题,而不是您的问题。
如果可以更改基类,可以将public
改为protected
。
否则,除了告诉人们而不是这样做之外,您无能为力。
你不能。C语言强制转换包括reinterpret_cast功能,你不能阻止任何两个数据指针类型之间的reinterpret_cast。
请注意,在某些多重继承的情况下,该强制转换不会进行所需的调整,因此可能无法达到预期的结果。(static_cast将进行调整,但将检查可访问性)。
这看起来好像HouseLocator
可能不应该从Locator
派生。在有限的上下文中,您可能希望使用定位符(即,将其组成为私有成员变量)。
私有继承几乎只用作组合设备。
继承通常用于需要某种类型的异构集合,并且希望以相同的方式对待它们(或在类似的情况下)。如果您使用派生类的方式要求您知道派生类型,继承实际上通常会损害您的设计,因为它是最紧密的耦合形式(必须被构造在一起,不能被反弹)。
不值得去阻止它。用户可以做Locator* p = new Locator(); p->GoToLocation(10,10);
您也可以转换操作符
operator Locator() const;
在HouseLocator类中引发异常。但是这不会阻止reinterpret_cast<>的转换。没有什么可以阻止它。
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- 类模板实例化中的类型转换