我知道,如果虚拟关键字覆盖了虚拟基函数,那么在派生类成员函数声明中不需要重新使用它,但这样做是否可以清楚地表明它是虚拟的?另外,在声明和/或定义中出现const关键字又如何呢?我想Alexandrescu提到了这件事,但我想不起来是什么了?
发布于 2012-06-17 10:01:54
你的问题似乎很混乱。当覆盖基类方法时,virtual是可选的。如果需要,const永远不是可选的。这并不像您认为的那样:
struct A
{
virtual void Func() const;
};
struct B : public A
{
virtual void Func();
};结构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.
};https://stackoverflow.com/questions/11068319
复制相似问题