C++ 11中引入了overridefinal说明符,下面的程序使用这些说明符如下:

#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虚拟功能)


[ 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 ]

一个类可能不是其自身的派生类。因此,您显示的代码将被编译。




[ 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-specidier覆盖标记,并且实际上覆盖了基类的函数。

关于c++ - 可以在C++中使用 “override & final”说明符声明类的相同成员函数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26543711/

10-11 18:09