在过去的几周里,有件事困扰着我关于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 {}
};什么是最好的方法?
发布于 2021-11-11 17:46:11
根据C++核心指南C.128,每个虚函数声明都应该指定,即virtual、override或final的一个。
virtual:用于基类中函数的“第一次”外观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"); }
};https://stackoverflow.com/questions/39932391
复制相似问题