类的相同成员函数可以用 c++ 中的说明符声明"override & final"吗?
Same member function of a class can be declared with "override & final" specifier in c++?
重写和最终说明符已在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 nbspfinal
virt说明符seq并不意味着声明中的virt说明符中有任何顺序。
我们什么时候应该在程序中使用它?
这个问题可能值得一看。
看起来来自莫斯科的Vlad是正确的
来自cppreference.com上的重写说明符:
声明符virt说明符seq(可选)函数体在这两种情况下,如果使用virt说明符seq,则为override或final,或者final override或override final。
同样,对于cppreference.com上的最后一个说明符:
声明符virt说明符seq(可选)函数体virt说明符seq(如果使用)是override或final,或者最终override或覆盖最终。
撇开编译器的错误不谈,我鼓励您选择一个顺序并坚持它——不要在代码库中混合和匹配单词顺序。
- 使用说明符 extern 声明的C++中的标识符链接
- 错误:不能使用"显式"说明符声明 bool'
- 为什么转换函数声明不需要至少一个定义类型说明符
- C++需要所有声明的类型说明符和预期的非限定 id(需要调试帮助)
- 我们可以在声明中的任何位置放置"typedef"说明符吗?
- 缺少类型说明符 - int 假定 声明静态成员后出错
- 在类外部初始化的 constexpr 静态成员的声明中是否需要 constexpr 说明符
- 最终说明符对单独的声明和定义无效
- 在类中创建向量(2D 数组)的向量 - Error:C++ 需要所有声明的类型说明符
- 使用 boost program_options时,如何确保声明具有C++的存储类或类型说明符?
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 声明 Windows API 结构 (DCB) 的对象 - 错误 C4430:缺少类型说明符 - 假定为 int
- typedef float _float32;的声明说明符中的两种或多种数据类型;
- 更新到 Xcode9 后,我得到C++需要所有声明的类型说明符
- 解析问题:预期的不合格的ID和语义问题:C 需要所有声明的类型说明符
- 在声明中可以放置存储类说明符的位置
- C++11,“noexcept”说明符,定义与声明
- 令牌之前的预期声明说明符或'...' '*'
- 布尔值之前的预期声明说明符或'...'
- 预期的声明说明符或"..."在"布尔值"之前