设为首页 加入收藏

TOP

1.4.1 虚函数
2013-10-07 01:10:07 来源: 作者: 【 】 浏览:77
Tags:1.4.1 函数

1.4  虚函数和多态

虚函数是C++(www.cppentry.com)中用于实现多态性的机制,而虚函数存在于继承环境中,在继承关系下,派生类作为基类的子类,在任何要求基类对象的地方使用派生类对象是有意义的。

声明虚函数的方法是在基类中的成员函数原型前加上关键字virtual。其格式如下:

  1. class 类名  
  2. {  
  3. ...  
  4. virtual 类型 函数名(参数表);  
  5. ...  
  6. }; 

1.4.1  虚函数

1. 虚函数的语法

虚函数的标志是"virtual"关键字。假设有下面的类层次:

  1. class A  
  2. {  
  3. public:  
  4. virtual void Print();  
  5. };  
  6. class B : public A  
  7. {  
  8. public:  
  9. void Print();           // 没有virtual关键字!  
  10. };  
  11. class C : public B       // 从B继承,不是从A继承!  
  12. {  
  13. public:  
  14. void Print();           // 也没有virtual关键字!  
  15. }; 

这种情况下,B::Print()是虚函数,C::Print()也同样是虚函数。因此可以说,基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字。

2. 虚函数的特性

当一个类的成员函数说明为虚函数后,就可以在该类的(直接或间接)派生类中定义与其基类虚函数原型相同的函数。当用基类指针指向派生类对象时,系统会自动用派生类中的同名函数来代替基类中的虚函数。也就是说,当用基类指针指向不同的派生类对象时,系统会在程序运行中根据所指向对象的不同,自动选择适当的函数,从而实现了运行时的多态性。

假设有下面的类层次:

  1. class A  
  2. {  
  3. public:  
  4. virtual void Print() { cout << "A::Print() is called" << endl;}  
  5. };  
  6. class B : public A  
  7. {  
  8. public:  
  9. virtual void Print() { cout << "B::Print() is called" << endl;}  
  10. }; 

那么,在使用的时候,用户可以:

  1. A *s = new B();  
  2. s->Print();  // 输出B::Print() is called 

在这里,s虽然是指向基类A的指针,但是被调用的函数Print()却是派生类B的。

这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓"动态联编"上,一个类的成员函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的成员函数还是哪个派生类的函数,所以被称为"虚"函数。

虚函数总是在派生类中被改写,这种改写被称为重载(override)。重载是指派生类重写基类的虚函数,就像我们前面B类中重写了A类中的Print()函数。重写的成员函数必须与基类的成员函数有一致的参数表和返回值。

什么时候使用虚函数呢?在设计一个基类的时候,如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的。
从设计的角度讲,出现在基类中的虚函数是接口,出现在派生类中的虚函数是接口的具体实现。通过这样的方法,就可以将对象的行为抽象化。

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.3 继承和派生 下一篇1.2.6 静态成员

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: