-1

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

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

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

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

4

2 回答 2

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 ()
于 2012-03-16T15:24:18.010 回答
2

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

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

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

于 2012-03-16T15:23:56.137 回答