C ++覆盖最终和纯虚方法

时间:2012-03-16 15:12:24

标签: c++ override virtual final

考虑派生类的基类,其中基类应该为其所有派生提供一些(多态)方法,例如armithmetic或bitweise重载运算符。派生类不应修改此操作以确保正确执行。但是,与此同时,我希望进行评估 - 在我的示例中使用函数isError() - 运算符必须是子类和纯虚拟的,因此必须定义:

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

在现有标准下似乎不允许这样做,因为“纯虚拟性”意味着子类必须实现基类的所有虚函数,而“final”关键字与此范例相矛盾。

如何处理这个矛盾的任何建议或想法?

2 个答案:

答案 0 :(得分:5)

我认为你被误导了如何处理纯虚拟成员函数以及它们的用途。

在从您的基础继承的类中,只有纯虚拟 的成员函数必须被定义为

我猜你在混淆整个Base将成为抽象的事实。


这篇文章中的代码片段工作正常,并导致您所描述的行为。虽然virtual函数final使Base函数失败了,但它的目的却失败了。

我建议您删除虚拟说明符

这是,除非您的#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 ()

<强>输出

{{1}}

答案 1 :(得分:2)

你似乎错误地认为纯虚函数意味着什么。

  

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

不,纯虚拟性要求子类覆盖特定的函数。非纯函数不必被覆盖,当然不能被声明为final