如何在c++中防止这种类型的强制转换?

How can I prevent this kind of casting in c++

本文关键字:类型 转换 种类 c++      更新时间:2023-10-16

假设有两个这样的类

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<>的转换。没有什么可以阻止它。