在C++中const和虚拟关键字的位置有什么好的约定(或要求)?

Pal*_*han 0 c++ virtual

我知道如果虚拟关键字覆盖虚拟基本函数,则不需要在派生类成员函数声明中重用它,但是这样做是为了明确它是虚拟的吗?另外,声明和/或定义中是否存在const关键字呢?我认为Alexandrescu提到了一些关于此的事情,但我不记得它是什么?

Nic*_*las 6

你的问题似乎很困惑.virtual在覆盖基类方法时是可选的.如果你需要,它绝不const可选的.这不符合你的想法:

struct A
{
  virtual void Func() const;
};

struct B : public A
{
  virtual void Func();
};
Run Code Online (Sandbox Code Playgroud)

该struct B两个名为的函数Func.当调用它的对象是const,其中一个将被调用,而另一个将被调用const.此代码中没有任何内容被覆盖 ; 这是两个独立的虚函数.

你不能只是忽略const并希望一切都能很好地解决.

实际上,这个例子也说明了virtual当你重写派生类时应该使用的原因.在这种情况下,很明显你打算覆盖基类函数,但是你的函数签名错了.如果没有virtual那里,就不会立即表明您打算覆盖某些东西.

这不是一个巨大的帮助,但它是一个东西.

C++ 11使用override伪关键字提供了更好的解决方案(因为它实际上解决了问题).

struct A
{
  virtual void Func() const;
};

struct B : public A
{
  virtual void Func() override; //Gives a compiler error, since it is not overriding a base class function.
};
Run Code Online (Sandbox Code Playgroud)