以互斥的方式覆盖虚函数

时间:2015-09-07 12:52:35

标签: c++ oop

class EventListener
{
public:
    virtual void onEvent (std::string message) = 0;
    virtual void onEvent (std::string message, int eventCode) = 0;
};

class CustomEventListener : public EventListener
{
public:
    void onEvent(std::string message) {};
    void onEvent(std::string message, int eventCode) {}; // I want this to throw an error
};

我想这样做,以便覆盖其中一个重载函数会使用户不能覆盖另一个,这可能会引发编译时异常。这可能吗?

我想在界面中保留两个虚拟功能的原因是为了保持与已经在其应用程序中广泛使用第一个功能的用户的向后兼容性,并且我不想强迫他们使用第二个,更新的。

使两个函数都不是非纯粹的选项,因为我想强制用户覆盖其中一个函数。

3 个答案:

答案 0 :(得分:2)

为什么不通过进一步的实现来强制只覆盖其中一个:

class CustomEventListener : public EventListener {
public:
    virtual void onEvent(std::string message) {};

private: // <<<<<<<<
    // I want this to throw an error
    virtual void onEvent(std::string message, int eventCode) { 
        throw std::runtime_error("Deprecated");
    }
};

答案 1 :(得分:2)

  

我想这样做,以便覆盖其中一个重载函数会使用户不能覆盖另一个,这可能会引发编译时异常。这可能吗?

没有。根据其他覆盖,不可能有条件地防止覆盖功能。至少不是标准的c ++。

  

我想在界面中保留两个虚拟功能的原因是为了保持与已经在其应用程序中广泛使用第一个功能的用户的向后兼容性,并且我不想强迫他们使用第二个,更新的。

如果向界面添加新的纯虚函数,那么尚未实现新函数的所有继承类将变为抽象。这将打破向后兼容性。

阻止用户实施其中一个将无济于事。相反,它只会阻止它们创建一个继承接口的具体类。

答案 2 :(得分:0)

当用户2079303回答时,你不能像你建议的那样去做。

但是,你可以做一些可以实现你想要实现的技巧。

class EventListener
{
public:
    virtual void onEvent (std::string message)
    {
        throw std::runtime_error("Deprecated");
    }
    virtual void onEvent (std::string message, int eventCode)
    {
        onEvent(message);
    }
};

旧类仍然只能覆盖第一种方法。

class CustomEventListener : public EventListener
{
public:
    void onEvent(std::string message) {};
};

新类被强制(因此仅由异常)覆盖其中一个,所以它们看起来像这样:

class CustomEventListener : public EventListener
{
public:
    void onEvent(std::string message, int eventCode) {};
};

不幸的是,用户也可以覆盖它们,但是你无能为力。

要正确处理这种情况,您应该在代码中调用第二种方法。