0

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

4

1 回答 1

6

你的问题似乎很困惑。virtual覆盖基类方法时是可选的。如果您需要,它const永远不是可选的。这不会像您认为的那样做:

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

struct B : public A
{
  virtual void Func();
};

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

您不能只是忽略const并期望一切正常。

事实上,这个例子也说明了为什么virtual在派生类中重写时应该使用。在这种情况下,很明显您打算重写基类函数,但函数签名错误。如果没有virtual那里,就不会立即表明您打算覆盖某些东西。

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

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

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.
};
于 2012-06-17T02:01:53.857 回答