【问题标题】:C++ override final and pure virtual methodsC++ 覆盖最终和纯虚方法
【发布时间】:2012-04-02 03:31:04
【问题描述】:

考虑一个类,它应该为其所有子类提供一些(多态)方法,例如算术或位运算符。这些操作不应被派生类修改以确保正确执行。但是,与此同时,我希望单独定义子类的评估(在我的示例中使用函数 isError()):

class Mom
{
public:
    virtual bool operator && (const Mom&) const final
    {
        return this->isError() && p_rOther.isError();
    }
private:
    virtual bool isError() = 0;
};

鉴于当前的标准,这似乎是不允许的,因为“纯虚拟性”意味着子类必须实现基类的所有虚拟功能,而“final”关键字与此范式相矛盾。

对如何处理这种矛盾有什么建议或想法吗?

【问题讨论】:

  • 对不起,我不知道你在说什么。
  • 纯虚函数必须被覆盖——这并不意味着任何其他虚函数都必须被覆盖。
  • @gilgamash:“我需要覆盖所有的虚拟方法”——不,只有纯的。
  • 这并不矛盾。派生类必须实现所有纯虚函数,但它们不必重新实现其他虚函数(除非他们愿意)。
  • 永远不要创建自己的operator&&,因为它会改变运算符的语义(创建自己的运算符后它不再短路)。

标签: c++ c++11 overriding final pure-virtual


【解决方案1】:

我假设您对纯虚拟成员函数的处理方式以及它们的用途有误解。

只有声明为纯虚拟的成员函数必须在继承自你的基类的类中定义 .

我猜你把它与整个Base 将成为抽象的事实混淆了。


本文后面的 sn-p 可以正常工作,并导致您描述的行为。虽然拥有virtual 函数使final 有点违背它的目的。

我建议您删除 虚拟说明符

这是除非您的 Base 继承自 virtual 功能所在的基础,并且您希望向未来的开发人员说明这一点阅读您的代码。


#include <iostream>

struct Base {
  virtual bool operator&& (Base const& rhs) const final {
    std::cerr << "Base ::operator&& ()\n";

    return this->error () && rhs.error (); 
  }

  virtual bool error () const = 0;
};

struct Child : Base {
  virtual bool error () const {
    std::cerr << "Child::error ()\n";

    return true;
  }
};

int
main (int argc, char *argv[])
{

  Child ch1,   ch2;
  ;     ch1 && ch2;
}

输出

Base ::operator&& ()
Child::error ()
Child::error ()

【讨论】:

  • 是的,谢谢,我把你说的弄糊涂了。很抱歉,给您带来的不便,我们深表歉意,感谢您的帮助!
  • @gilgamash 如果您对所提供的信息感到满意,请不要忘记将答案标记为已接受,很高兴为您服务。
  • Only member-functions declared to be pure virtual must be overloaded in the classes inheriting from your base. 重载,还是覆盖
  • @Dan 说实话,我应该写“定义”。感谢您的输入,我会尽快纠正问题。 (如果您满意,请删除您的评论后期编辑,这是为了不混淆未来的读者)。谢谢。
【解决方案2】:

您似乎误解了纯虚函数的含义。

“纯虚”意味着子类必须实现基类的所有虚函数

不,纯虚拟要求子类覆盖那个特定的函数。非纯函数不必重写,如果声明为final,当然也不能重写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 2012-02-19
    • 2014-05-22
    • 2018-11-16
    • 2018-06-02
    • 2018-08-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多