我应该使用virtual, override,还是两者都使用?
Should I use virtual, override, or both keywords?
在过去的几周里,一些关于virtual
和override
的事情一直困扰着我。我了解到,当你做继承与虚函数,你必须添加virtual
,让编译器知道搜索正确的函数。后来我还了解到在c++ 11中有一个新的关键字——override
。现在我有点困惑了;我是否需要在我的程序中同时使用虚拟和覆盖关键字,或者最好只使用其中一个?
解释我自己-我的意思的代码示例:
class Base
{
public:
virtual void print() const = 0;
virtual void printthat() const = 0;
virtual void printit() const = 0;
};
class inhert : public Base
{
public:
// only virtual keyword for overriding.
virtual void print() const {}
// only override keyword for overriding.
void printthat() const override {}
// using both virtual and override keywords for overriding.
virtual void printit() const override {}
};
最好的方法是什么?
当你重写一个函数时,技术上你不需要写virtual
或override
。
原始基类声明需要关键字virtual
将其标记为virtual。
在派生类中,通过与基类函数具有相同的类型,函数是虚函数。
然而,override
可以通过在预期的覆盖在技术上不是覆盖时产生编译错误来帮助避免错误。例如,函数类型与基类函数并不完全相同。或者基类的维护改变了函数的类型,例如添加默认实参。
以同样的方式,在派生类中使用virtual
关键字可以确保该函数在进一步的派生类中仍然是虚函数,从而使这种错误变得更加微妙。
使用
virtual
作为基类函数的声明。
这在技术上是必要的。使用
override
(仅)用于派生类的重写。
的例子:
struct Base { virtual void foo() {} };
struct Derived: Base { void foo() override {} };
<一口>指出:
c++支持协变原始指针和原始引用结果。对于协方差,覆盖的类型并不完全相同。它只是有一个兼容的类型。一口>
根据c++核心指南C.128,每个虚函数声明应该只指定virtual
、override
或final
中的一个
-
virtual
: For "first"基类 中函数的外观 -
override
:对于从基类派生的类中提供相同(或协变)签名的virtual
函数的virtual
函数的重写 -
final
:将重写标记为不可重写。也就是说,具有final
虚函数覆盖的类的派生类不能重写该虚函数覆盖。
struct A {
virtual void go() { puts("A"); }
};
struct B : A {
// Overrides A::go(). No need to specify `virtual` explicitly,
// it already implicitly is virtual and overrideable
void go() override { puts("B"); }
};
struct C : B {
void go() final { puts("C"); }
//virtual void go() override final { puts("C"); } would still compile,
// but it is considered, for lack of a better description, "extra"
};
struct D : C {
// Would produce error C3248 : 'C::go' : function declared as 'final' cannot be overridden by 'D::go'
//void go() override { puts("D"); }
};
相关文章:
- 当两者都调用时,删除和析构函数之间的区别?
- C++类:virtual和override,或者两者都没有
- 无符号 int 与无符号长 两者都是 32 位,但我无法在不转换的情况下混合它们......为什么?
- 带大小参数和不带大小参数的"运算符删除":当两者都可用时,选择哪一个?
- 将字符串转换为整数。为什么会出现此错误?我想将 ID(字符串)更改为 IC(整数)。两者都是数组。顺便说一句,我仍然是初学者
- 无限循环与无限递归.两者都未定义吗?
- 共享的静音和静音之间的差异(为什么两者都存在于C 17中)
- x&=y 是否等同于 x = x &&y 如果两者都是 c++ 布尔值
- 两种模板类型的sizeof,当两者都是从一个基派生时
- 如果其中一个为真,则 && 结束循环,而不是如果两者都为真
- 如何编写两个初始化操作(一个作为默认初始化,另一个作为用户输入)?两者都是类的构造函数C++
- 要检查它是完整的二叉树还是完全二叉树,或者两者都不是
- 试图使用模数或fmod,但两者都给我的程序带来了问题
- 编译 SkyFireEMU 错误,sizeof(void *) 两者都不是
- 类将自身传递给其他类的构造函数,两者都使用模板定义
- 顶级或低级常量,或者两者都不存在
- 从一个模板类转换到另一个(两者都派生自同一基类)
- 我应该使用virtual, override,还是两者都使用?
- 如何从另一个文件中调用与另一个文件中同名的函数(当两者都包含时)
- 当两者都是普通char类型时,为什么is_base_of会失败?