类的相同成员函数可以用 c++ 中的说明符声明"override & final"吗?

Same member function of a class can be declared with "override & final" specifier in c++?

本文关键字:声明 说明符 override final c++ 成员 函数      更新时间:2023-10-16

重写和最终说明符已在C++11中引入。下面的程序使用这些说明符如下:

#include<iostream>
template<typename T>
void display(const T& val) { std::cout<<val<<"n"; }
class Shape {
public:
    virtual ~Shape()= default;
    virtual void Draw() { display("Shape::Draw()");}
   virtual void DisplayName() { display("Shape");}
};
class Circle : public Shape {
public:
    virtual ~Circle() = default;
    virtual void Draw() override final { display("Circle::Draw()");}
    virtual void DisplayName() override { display("Cicle");}
};

int main()
{
}

在上面的示例程序中,Circle::Draw()被定义为override final说明符。但是,如果相同的方法被定义为final override,则它会成功编译,并抛出编译时错误。

想了解类的同一方法的重写和最终说明符的用例吗?。我们什么时候应该在程序中使用它?

在我看来,这是一个编译器错误。至少在www.ideone.com上,代码编译成功。

符合C++标准(10.3虚拟功能)

4如果某个类B中的虚拟函数f用virt说明符final和从B派生的类D中的函数D: :f覆盖B::f,则程序格式不正确。

[ Example: 
struct B {
virtual void f() const final;
};
struct D : B {
void f() const; // error: D::f attempts to override final B::f
};
—end example ]

类可能不是其自身的派生类。因此,你展示的代码将被编译。

还有

5如果虚拟函数标记有virt说明符override和不重写基类的成员函数,该程序不正规。

[ Example:
struct B {
virtual void f(int);
};
struct D : B {
virtual void f(long) override; // error: wrong signature overriding B::f
virtual void f(int) override; // OK
};
—end example ]

在您的示例中,类Circle的函数Draw被标记为virt-specifieder覆盖,实际上覆盖了基类的函数。

这是一个编译器错误。根据C++11标准在[class.mem]中指定的语法:

成员声明人:
 nbsp nbsp nbsp nbsp;声明人virt说明符seqopt纯说明符
 nbsp nbsp nbsp nbsp;声明人大括号或相等的初始值设定项opt
 nbsp nbsp nbsp nbsp;标识符opt属性说明符seqopt:常量表达式
virt说明符seq:
 nbsp nbsp nbsp nbsp;virt说明符
 nbsp nbsp nbsp nbsp;virt说明符seqvirt说明符
virt说明符:

 nbsp nbsp nbsp nbsp;override
 nbsp nbsp nbsp final

virt说明符seq并不意味着声明中的virt说明符中有任何顺序。

我们什么时候应该在程序中使用它?

这个问题可能值得一看。

看起来来自莫斯科的Vlad是正确的

来自cppreference.com上的重写说明符:

声明符virt说明符seq(可选)函数体在这两种情况下,如果使用virt说明符seq,则为override或final,或者final overrideoverride final

同样,对于cppreference.com上的最后一个说明符:

声明符virt说明符seq(可选)函数体virt说明符seq(如果使用)是override或final,或者最终override覆盖最终

撇开编译器的错误不谈,我鼓励您选择一个顺序并坚持它——不要在代码库中混合和匹配单词顺序。