Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4213155
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: C/C++

2011-04-20 12:50:30

                  虚函数


1. 首先,看一个程序 如下

B 继承了 A   B 包含两个output 函数

C 继承了 B   C 包含三个output 函数





2. 当我们通过下面的程序,想 分别访问 a b c 的 output

函数时,下面的程序是不能真确访问到 output

它只能访问到 c的output 函数

因为  c++ 引入了 覆盖 机制,

例如:当我们访问B时 , 继承类 B output函数 覆盖了 A

的output函数,只会输出B的output
    
      当我们访问C时,  继承类 C output 函数 覆盖 B 的

output 函数,直呼输出 C 的output


下面 的output 函数,都是调用的 C 类的output 函数





下面的程序 也只能 访问到 a 的output 函数







3.如何解决上述不具备多态性的问题??


    虚函数机制:  将不同层次完全一样的函数声明为虚函数。

即,前面加上一个 virtual 关键字,这时候,程序执行时就

具备多态性了。



  1. class A
  2. {
  3.   public:
  4.     virtual void output();
  5. };

  6. class B:pulic A
  7. {
  8.   public:
  9.     virtual void output();
  10. };

  11. class C:public B
  12. {
  13.   public:
  14.    virtual void output();
  15. };
通过使用 virtual 我们就可以访问不同类的 output 函数了

  1. vodi function(A &x)  基类A, 可以从基类到 派生类访问
  2. {
  3.   x.output();
  4. }

  5. void main()
  6. {
  7.   A a;
  8.   B b;
  9.   C c;
  10.   
  11.   function(a);
  12.   function(b);
  13.   function(c);
  14. }


3.

  当某个函数在不同层次的类中完全相同时,在程序执行时我

们根据不同对象,应该调用哪个层次的函数,我们采用了一种

虚函数的机制:


 1. 如果这个函数不加 virtual ,则通过指针或引用来调用

这个函数时,这个函数只具备“一态性”(此刻,所调用的函

数在指针或者引用的类中),而不具备“多态性”。


2. 如果这个函数加了 virtual ,则通过指针或引用来调用

这个函数时,这个函数就具备“多态性”(指向的对象不同,

则调用的函数所在层次不同,由对象所在的类来决定)




阅读(1203) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~