具有不同参数的同一纯虚函数的两个覆盖函数

Two override functions of the same pure-virtual function with different parameters?

本文关键字:函数 覆盖 两个 参数      更新时间:2023-10-16

我有一个抽象类A,里面toDoOrNotToDo了一个纯虚函数。我有两个子类,A1A2 ,这样A1需要 toDoOrNotToDoconst int x参数来完成它的工作,而A2不需要该参数来完成它的工作。

但是如果我写

class A2 : public A {
public:
    int toDoOrNotToDo() const override;
};

它显然会抱怨:

'int A2::toDoOrNotToDo() const' 标记为覆盖,但不覆盖

我只能写:

class A {
public:
    virtual int toDoOrNotToDo(const int x) const = 0;
    virtual ~A();
};
class A1 : public A {
public:
    int toDoOrNotToDo(const int) const override;
};
class A2 : public A {
public:
    int toDoOrNotToDo(const int) const override;
};

但是在A2::toDoOrNotToDo中,我有一个不需要的参数。

如何改进设计?

首先确定接口。如果函数不需要 int 参数,则在不违反 Liskov 替换原则的情况下,实现就不能要求它。

如果需要,只需将其放入接口类中即可。只要参数被记录为"可能不会影响结果",一切都很好。

然而,对我来说,整个场景看起来是一个糟糕的设计——也许抽象并不真正有效,你使用了错误的工具来完成工作?