题
虽然通过一些旧代码拖网我碰到类似下面的东西来了:
class Base
{
public:
virtual int Func();
...
};
class Derived : public Base
{
public:
int Func(); // Missing 'virtual' qualifier
...
};
代码编译细(MS VS2008),没有警告(级别4)和它的工作原理如预期 - Func
是即使虚拟限定符在派生类缺少虚拟。现在,不是导致一些混乱外,还有什么危险与此代码或我应该改变这一切,加上virtual
预选赛?
解决方案
在virtual
将在派生类中延续到所有重写功能。唯一真正的好处添加关键字是表示你的意图派生类定义的一个漫不经心的观察者会立即知道Func
是虚拟的。
即使延伸派生将具有虚拟函数功能方法的类。
参考:虚函数的MSDN上。向下滚动页面以查看
的虚拟强>关键字时,可以使用 声明在首要功能 派生类,但它是不必要的; 虚拟功能覆盖是 总是虚拟
其他提示
下面是不需要申报压倒一切的功能的一个有趣的结果虚拟:
template <typename Base>
struct Derived : Base
{
void f();
};
无论派生中的F将是虚拟取决于是否派生被实例化以与虚拟函数f正确的签名的一个位置。
有人告诉我,一旦很老的C ++编译器,不符合规范,需要虚拟的所有子类进行设置。这不是一个问题了。
以下这种做法的一个危险是,人们可能没有意识到他们需要在其意图是虚函数virtual关键字。这是最容易被人从语言来不存在的非虚拟函数的概念(例如:Java中,REALbasic的)。作为推论,你不能告诉虚拟当已经故意省略,因为函数应该是非虚拟
我怀疑一些代码分析工具也可能不是足够聪明,拿起继承虚拟的。
不隶属于 StackOverflow