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

gil*_*ash -1 c++ overriding final pure-virtual c++11

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

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

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

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

Fil*_*efp 5

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

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

我猜你是在混淆整个事物Base会变得抽象的事实.


在这篇文章中进一步向下的片段工作正常,并导致您描述的行为.虽然有virtual功能使其final失败了它的目的.

我建议你删除虚拟说明符.

这是除非Base是从基继承其中的虚拟函数存在,并且你想搞清楚未来开发商阅读你的代码.


#include <iostream>
Run Code Online (Sandbox Code Playgroud)

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;
  }
};
Run Code Online (Sandbox Code Playgroud)
int
main (int argc, char *argv[])
{

  Child ch1,   ch2;
  ;     ch1 && ch2;
}
Run Code Online (Sandbox Code Playgroud)

产量

Base ::operator&& ()
Child::error ()
Child::error ()
Run Code Online (Sandbox Code Playgroud)