正文

多态性和虚函数2009-02-28 21:45:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/41138.html

分享到:

   多态性也是面向对象程序设计方法的一个重要特征,它主要表现在函数调用时实现“一种接口,多种方法”。

   <1>基类指针指向派生类对象

SonClass son=new SonClass();

FatherClass father=new SonClass();//创建子类,返回基类引用

这是一个IS-A模型,例如“麻雀:鸟”,在这个模型中当然能得出“麻雀是鸟”,但反过来“鸟是麻雀”显然是不对的,即SonClass son=new FatherClass ();是不正确的。

new SonClass()完成的是创建SonClass对象,分配内存空间和初始化操作,然后将这个对象的引用通过=赋给father变量也就是建立father变量与SonClass对象之间的关联

应用类型的区别决定了不同的对象在方法表中不同的访问权限中的son对象和②中的father对象在内存布局上是一样的,差别就在于其引用指针的类型不同:fatherFatherClass类型指针,而sonSonClass类型指针。其区别如下左图所示。

即使将一个基类指针指向派生类对象,通过该指针也只能访问派生类中从基类继承的公有成员,不能访问派生类自定义的成员,除非通过强制类型转换为派生类指针(派生类指针也可以强制转换为基类指针)。如下右图所示。

//basePtr.cpp : 测试基类对派生类的引用

#include "stdafx.h"

#include<iostream>

using namespace std;

class A

{

private:

     int a;//a

public:

     void setA(int i){a=i;}

     void showA(){cout<<a<<endl;}

};

 

class B:public A

{

private:

     int b;//a,b

public:

     void setB(int i){b=i;}

     void showB(){cout<<b;}

};

 

int _tmain(int argc, _TCHAR* argv[])

{

     A a,*pa;//pa为基类对象指针

     B b,*pb;//pb为派生类对象指针

     pa=&b;//基类指针pa指向派生类对象b

     pa->setA(100);     pa->showA();

     pb=(B*)pa;//将基类指针pa强制转换为派生类指针

     pb->setB(200);     pb->showB();

     cin.get();

}

(1)      上述程序中若使用pa->setB()pa->showB()是非法的。

(2)        如果把语句pa=&b;改为pb=&a;也将编译出错,因为违反了IS-A原则。

(3)        C++中赋值a=b;是正确的;而A refA=new B();将提示出错

<2>虚函数

#include "stdafx.h"

#include<iostream>

using namespace std;

class A

{

public void show(){cout<<"A.Show()"<<endl;}

};

class B:public A

{

public void show(){cout<<"B.Show()"<<endl;}

};

int _tmain(int argc, _TCHAR* argv[])

{

     A *pa;//pa为基类对象指针

     B b;//b为派生类对象

     pa=&b;//基类指针pa指向派生类对象b

     pa->show();//调用的是A.show();

    b.show();//调用的是B.show();

     cin.get();

}

                       

               

 

   在上面的代码中,基类pa虽然指向了派生类对象,但是对于同名show,还是调用基类A的成员函数show()而非派生类对象bshow()

   如果想通过指向派生类对象的指针调用派生类中覆盖的成员函数,只有使用虚函数virtual function)。

   在一个类继承结构中,可以使用一个函数表示不同的功能,以实现多态性。在C++中是通过虚函数机制来实现这种类的行为的多态性。

   在上例中只要public void show()改为public virtual void show()则后面的pa->show();调用的是B.show()

阅读(1707) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册