Virtual这个关键字在多态中扮演一个绝对重要的角色,只要member functions声明的前面加上virtual的关键字,他就会成为 Virtual member functions。任何一个class如果拥有virtual functions,就可以得到C++编译器的虚拟机制(virtual mechanism)的服务。这个class的所有derived classes,也都会继承这些virtual functions。derived class决定重新定义virtual functions(而不再沿用base class的定义),这个动作称为override(改写),这时候我们需要在derived class中重新声明virtual functions并重新定义代码。重新声明时不需要特别再加上virtual字眼,可以说是“一代为virtual,世代为virtual"。不过,我建议不厌其烦地在derived classes中为每一个你想要重新定义的virtual functions都加上virtual关键字,这对于代码的可读性有帮助。
Virtual functions的妙用,在Inheritance(继承)和Polymorphism(多态)情况下才会发挥得淋漓尽致,以下我们以一个简单的例子来展示一下virtual functions带来的影响:
1 #include <iostream> 2 3 using namespace std; 4 5 class CShape 6 { 7 public: 8 virtual void display(){cout<<"CShape"<<endl;}; 9 10 protected: 11 int m_color; 12 }; 13 14 class CRect:public CShape 15 { 16 public: 17 void display(){cout <<"CRect"<<endl;}; 18 19 }; 20 21 22 int main() 23 { 24 CShape* pShape1=new CShape; 25 pShape1->display();//输出CShape 26 CShape* pShape2=new CRect;//polymorphic 27 pShape2->display();//输出CRect; 28 29 return 0; 30 }
执行结果很妙,我们以相同的类型指针(CShape)呼叫相同的函数(至少表面上看相同),但结果却是:
显然所唤起的virtual function因为指标真正指向的object不同而不同。正是如此,以base type pointer指向derived type object,就是所谓的polymorphism(多型),搭配virtual functions,可以有非常大威力,但请注意,这个威力唯有透过指针的形式才得以呈现。拥有virtual functions的class,我们就给予它一个特别的名称:polymorphic class。