Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该使用virtual、override还是同时使用这两个关键字?_C++_C++11 - Fatal编程技术网

C++ 我应该使用virtual、override还是同时使用这两个关键字?

C++ 我应该使用virtual、override还是同时使用这两个关键字?,c++,c++11,C++,C++11,在过去的几周里,我的大脑被一些关于virtual和override的问题困扰着。 我了解到,当您使用虚拟函数进行继承时,必须添加virtual,让编译器知道如何搜索正确的函数。 后来我也了解到,在C++ 11中有一个新的关键字->代码>覆盖> 。现在我有点困惑我是否需要在程序中同时使用虚拟关键字和覆盖关键字,还是最好只使用其中一个? 自我解释-我的意思的代码示例: class Base { public: virtual void print() const = 0; virtu

在过去的几周里,我的大脑被一些关于
virtual
override
的问题困扰着。 我了解到,当您使用虚拟函数进行继承时,必须添加
virtual
,让编译器知道如何搜索正确的函数。 后来我也了解到,在C++ 11中有一个新的关键字->代码>覆盖> <代码>。现在我有点困惑我是否需要在程序中同时使用虚拟关键字和覆盖关键字,还是最好只使用其中一个?

自我解释-我的意思的代码示例:

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

在派生类中,函数是虚拟的,其类型与基类函数的类型相同

但是,
覆盖
可以在预期的覆盖在技术上不是覆盖时产生编译错误,从而有助于避免错误。例如,函数类型与基类函数不完全相同。或者基类的维护会更改该函数的类型,例如添加默认参数

同样,派生类中的
virtual
关键字可以通过确保函数在进一步的派生类中仍然是虚拟的,从而使此类错误变得更加微妙

所以一般的建议是

  • 使用
    virtual
    进行基类函数声明。
    这在技术上是必要的

  • 对派生类的重写使用
    override
    (仅限)。
    这有助于维护

例如:

struct Base { virtual void foo() {} };
struct Derived: Base { void foo() override {} };
注:
C++支持协变原始指针和原始引用结果。对于协方差,覆盖的类型并不完全相同。它只是有一个兼容的类型。

无论何时,当您打算重写方法时,都应该使用
override
关键字。这样,如果您在派生类中键入了错误的名称,您将得到一个错误,告诉您没有找到可重写的方法。更有趣的问题是“如果我使用不带虚拟的重写会发生什么情况”一条经验法则:如果您要重写一个函数,请使用
override
。如果你不是,不要。简单?为什么标记为重复?在我看来,这清楚地说明了一个不同的问题,也是一个非常好的问题。这个问题涉及到代码风格(当使用
覆盖
时是否应该忽略
虚拟
),而另一个问题涉及到
覆盖
的机制。无论如何,我在这里找到了问题的答案。来自cppreference():“如果某个成员函数vf在类基中声明为虚函数,而直接或间接从基派生的某个派生类具有具有具有相同名称参数类型列表(但不是返回类型)的成员函数声明cv限定符ref限定符则派生类中的此函数也是虚函数(无论其声明中是否使用关键字virtual)并重写Base::vf(无论其声明中是否使用单词override)。”因此,在summay
中,override
是可用的。Soverride是可选的,因为此答案说明有助于检测编码错误