gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:43:01 27 4
gpt4 key购买 nike

overridefinal C++11引入了specifier,下面的程序使用了这些specifier:

#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 If a virtual function f in some class B is marked with the virt-specifier final and in a class D derived from B a function D::f overrides B::f, the program is ill-formed.

[ 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 If a virtual function is marked with the virt-specifier override and does not override a member function of a base class, the program is ill-formed.

[ 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 override 并且确实覆盖了基类的函数。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com