首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

不解。该如何解决

2012-02-27 
不解。#includeiostream.hclassA{public:vitrualvoiddisp()//这可用虚函数,也可不用,既然结果一样,为什么

不解。
#include   <iostream.h>

class   A
{
public:
        vitrual   void   disp()//这可用虚函数,也可不用,既然结果一样,为什么要用?
        {
              cout < < "class   A " < <endl;
        }
};

class   B:public   A
{
public:
          void   disp()
          {
cout < < "class   B " < <endl;
          }
};

class   C:public   A
{
public:
          void   disp()
          {
cout < < "class   C " < <endl;
          }
};

void   dispall(A   *p)
{
          p-> disp();
};

void   main()
{
A   a;
B   b;
C   c;
a.disp();
b.disp();
c.disp();
}

基类中声明虚函数,是为了派生类此函数有多种实现,可就算不用虚函数,也可以通过对象指针的类型,来调用相对应的函数,为什么要用?

[解决办法]
这是一个典型的多态问题了

虚函数正是为了这个目的存在的。

虚函数能处理动态的对象类别,而非虚函数则不可以
看以下情况

A* pA = &c;
pA-> disp();

这个会输出
class C
原因是,这个pA指针指向的对象动态型别是C

而,如果你不使用虚函数,那么会输出
class A
因为pA的静态型别是A,而该函数并不是虚函数,所以会调用A的disp,而不是C的

如果不声明成virtual function,那么你想用一个指针来处理A,B,C三类对象,就不可能了
输出总是
class A
[解决办法]
void main()
{
A *pa = new A;
A *pb = new B;
A *pc = new C;
pa-> disp();
pb-> disp();
pc-> disp();
}

热点排行