【问题标题】:Two override functions of the same pure-virtual function with different parameters?具有不同参数的相同纯虚拟函数的两个覆盖函数?
【发布时间】:2016-04-19 16:24:35
【问题描述】:

我有一个抽象类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 中我有一个不需要的参数。

如何改进设计?

【问题讨论】:

  • 您可以改用默认参数。只要这些函数没有相同的签名,它们就永远不会在虚拟继承中匹配。

标签: c++ inheritance abstract-class pure-virtual


【解决方案1】:

先决定接口。如果函数不需要 int 参数,则实现不能在不违反 Liskov Substitution Principle 的情况下要求它。

如果需要的话,只要放到接口类中即可。只要参数记录为“可能不会影响结果”,一切都很好。

但是,对我来说,整个情况看起来像是一个糟糕的设计——也许抽象并不是真正有效的,并且您使用了错误的工具来完成这项工作?

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 2011-03-10
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2013-10-04
    • 2016-02-05
    • 2022-01-13
    相关资源
    最近更新 更多