尽管其他人对虚拟方法的性能都是正确的,但我认为真正的问题是团队是否了解C ++中虚拟关键字的定义。
考虑这段代码,输出是什么?
#include <stdio.h>
class A
{
public:
void Foo()
{
printf("A::Foo()\n");
}
};
class B : public A
{
public:
void Foo()
{
printf("B::Foo()\n");
}
};
int main(int argc, char** argv)
{
A* a = new A();
a->Foo();
B* b = new B();
b->Foo();
A* a2 = new B();
a2->Foo();
return 0;
}
这里不足为奇:
A::Foo()
B::Foo()
A::Foo()
由于没有什么是虚拟的。如果在A和B类中都将virtual关键字添加到Foo的前面,我们将得到以下结果:
A::Foo()
B::Foo()
B::Foo()
几乎每个人都期望的。
现在,您提到存在错误,因为有人忘记添加虚拟关键字。因此,请考虑以下代码(将virtual关键字添加到A,但不添加到B类)。那么输出是什么?
#include <stdio.h>
class A
{
public:
virtual void Foo()
{
printf("A::Foo()\n");
}
};
class B : public A
{
public:
void Foo()
{
printf("B::Foo()\n");
}
};
int main(int argc, char** argv)
{
A* a = new A();
a->Foo();
B* b = new B();
b->Foo();
A* a2 = new B();
a2->Foo();
return 0;
}
答:就像将虚拟关键字添加到B一样?原因是B :: Foo的签名与A :: Foo()完全匹配,并且由于A的Foo是虚拟的,因此B的也是。
现在考虑B的Foo是虚拟的而A的不是虚拟的情况。那么输出是什么?在这种情况下,输出为
A::Foo()
B::Foo()
A::Foo()
virtual关键字在层次结构中向下而不是向上。它永远不会使基类方法成为虚拟方法。多态性是何时开始在层次结构中首次遇到虚拟方法的。以后的类无法使先前的类具有虚拟方法。
不要忘记,虚方法意味着该类为将来的类提供了重写/更改其某些行为的能力。
因此,如果您有删除虚拟关键字的规则,则可能没有预期的效果。
C ++中的virtual关键字是一个强大的概念。您应该确保团队的每个成员都真正了解这个概念,以便可以按设计使用它。