虚函数问题

来源:互联网 发布:制作单机app软件 编辑:程序博客网 时间:2024/05/16 07:02

 代码一:
#include <stdio.h>
class my_base 
{
 int a,b;
public:
 my_base(int x,int y)
 {a=x;b=y;}
 void show(){
 printf("a=%d,b=%d/n",a,b);}
};

class my_class:public my_base {
 int c;
public:
   my_class(int x,int y,int z):my_base(x,y)
 {c=z;}
 void show(){
  printf("c=%d/n",c);}
};


void main()
{
my_base mb(50,50),*mp;
my_class mc(10,20,30);
mp=&mb;
mp->show();
mp=&mc;
mp->show();
mc.show();

}

输入出结果:
a=50,b=50
a=10,b=20
c=30


代码二:

#include <stdio.h>
class my_base 
{
 int a,b;
public:
 my_base(int x,int y)
 {a=x;b=y;}
virtual void show(){                   ///////在代码一的基础上添加virtual
 printf("a=%d,b=%d/n",a,b);}
};

class my_class:public my_base {
 int c;
public:
   my_class(int x,int y,int z):my_base(x,y)
 {c=z;}
 void show(){
  printf("c=%d/n",c);}
};


void main()
{
my_base mb(50,50),*mp;
my_class mc(10,20,30);
mp=&mb;
mp->show();
mp=&mc;
mp->show();
mc.show();

}
输入出结果:
a=50,b=50
c=30
c=30


说明:
从代码一可以知道,虽然执行了语句:mp=&mc;但是mp->show();执行的函数还是基类的show()函数。
但是在代码二中添加了关键字virtual,mp->show()执行的函数就是my_class类的show()函数
 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

上面是我从其他地方转载的两段关于虚函数的代码,对理解虚函数有着非常大的作用。虚函数一直是我学C++的面向对象编程以来认为的一个比较难以理解的问题,但是它也发挥着重要的作用,是C++面向对象的一个重要特征。所以必须掌握它。

对于代码一当中的虽然执行了语句:mp=&mc;但是mp->show();执行的函数还是基类的show()函数这一点我还不大理解,着可能需要涉及到一些编译方面的知识,而现在,这些东西对于我来说还是一片空白。所以现在只能是把他给记住,相信理解它仅仅是时间问题。

下面是我转载另外一篇文章的部分,比较完整的阐述了多态和虚函数的作用,值得看一看。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

多态这么神奇,但是能用来做什么呢?这个命题我难以用一两句话概括,一般的C++教程(或者其它面向对象语言的教程)都用一个画图的例子来展示多态的用途,我就不再重复这个例子了,如果你不知道这个例子,随便找本书应该都有介绍。我试图从一个抽象的角度描述一下,回头再结合那个画图的例子,也许你就更容易理解。

    在面向对象的编程中,首先会针对数据进行抽象(确定基类)和继承(确定派生类),构成类层次。这个类层次的使用者在使用它们的时候,如果仍然在需要基类的时候写针对基类的代码,在需要派生类的时候写针对派生类的代码,就等于类层次完全暴露在使用者面前。如果这个类层次有任何的改变(增加了新类),都需要使用者“知道”(针对新类写代码)。这样就增加了类层次与其使用者之间的耦合,有人把这种情况列为程序中的“bad smell”之一。

    多态可以使程序员脱离这种窘境。再回头看看1.1中的例子,bar()作为A-B这个类层次的使用者,它并不知道这个类层次中有多少个类,每个类都叫什么,但是一样可以很好的工作,当有一个C类从A类派生出来后,bar()也不需要“知道”(修改)。这完全归功于多态--编译器针对虚函数产生了可以在运行时刻确定被调用函数的代码。

“如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的”。这句话也可以反过来说:“如果你发现基类提供了虚函数,那么你最好override它”。

原创粉丝点击