假设有两个这样的类

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

我进行私有(private)继承来阻止HouseLocator上的GoToLocation(),因为在那里没有意义,并迫使人们使用适当的接口(interface)。

现在我的问题是,如何防止这种铸造?
HouseLocator *phl = new HouseLocator;
Locator *pl = (Locator*)phl;
pl->GoToLocation(10, 10);

我是否应该证明不这样做,将其余部分留给用户使用,我的意思是,如果他做错了 Actor 表,那是他的问题吗?

最佳答案

使用合成代替继承:

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*,那么他们正在调用未定义的行为,那是他们的问题,而不是您的问题。

09-28 06:55