聊城共赢网络,聊城网站建设
我们专注:聊城做网站,聊城建网站,聊城网站建设,网站制作,虚拟主机,域名注册,网站推广等。联系电话:15066359825 点击这里给我发消息
最新公告 行业资讯  
当前位置:首页 --> 最新动态 --> 网站公告
C++多态演示\c++多态性演示
发布时间:2014/5/8 16:03:20

共赢网络:初学者对于多态的概念总是理解不清楚,一下通过几个实例在理解多态。
多态描述的是使用基类的指针或引用操作多个类型的能力。

我们知道,子类的指针是可以隐式转化为父类的,所以我们在进行程序设计的时候如果要对一个未知的类型进行处理,可以在方法声明时把参数的类型声明为父类的指针。

这要我们就是实现了根据传入的类型执行不同的方法。这里的关键是子类在重写父类的虚方法时是在虚方法表的相应位置对父类虚方法实现覆盖。

举个例子:

头文件classFile.h:

#ifndef classFile_Header_File
#define classFile_Header_File
class father
{
public:
virtual void show();
};
class son: public father
{
public:
void show();
void sayhi();
};
#endif

这里我们在子类中对父类实现了override(C++没有提供override关键字,所以改写父类的方法要格外小心)。

TestPoly.cpp代码如下:

#include<iostream>
#include"classFile.h"
using namespace std;

void hello(father* fp)
{
fp->show();
}
int main()
{
father f;
hello(&f);
son s;
hello(&f);

}

inline void father::show()
{
cout<<"I am father"<<endl;
}

inline void son::show()
{
cout<<"I am son"<<endl;
}

inline void son::sayhi()
{
cout<<"Hi, I am son"<<endl;
}

这里,传入父类的指针将调用father::show(),传入子类的指针时,虽然进行了隐式的类型转化,但是由于子类在其继承的虚方法表中相应的位置覆盖了父类的show()方法,所用调用的实际上son::show()的内容。此时子类的方法表中不存在father::show()了,如果我们把virtual关键字去掉,那么father::show()和son::show()将同时存在与子类的方法表中。

那么如果子类做了父类没用做的事情,我们应如何调用了?

比如这里,我们的子类中实现了sayhi()方法,这是父类指针father*无法获取到的地址(实际是无法直接获取到,通过手动的指针偏移还是可以的,不知道是C++的优点还是缺点),这个地方,如果我们能够通过实际传入的对象指针类型进行操作就OK了。还好C++为我们提过了这个功能,那就是引入关键字dynamic_cast。

我们把hello()函数改写如下:

void hello(father* fp)
{
son* ps=dynamic_cast<son*>(fp);//将fp 转换为son*类型
if(ps)//如果转换失败则返回0
ps->sayhi();
else
fp->show();
}

调用:

int main()
{
father f;
hello(&f);//转换失败,执行else
son s;
hello(&s); //输出Hi,I am son

}

www.lcgykj.cn

销售部 点击这里给我发消息
技术部
点击这里给我发消息
售后服务 点击这里给我发消息
公司电话(传真) 15066359825
聊城建网站首页   公司简介   网站建设   虚拟主机   域名注册   网站推广   公司资讯   成功案例   服务中心   联系我们  网站地图
版权所有 2008-2009 共赢网络 www.lcgykj.cn 公司地址:聊城市利民东路 邮编:252000
销售热线:15066359825 技术支持:QQ:297369059 销售在线服务: QQ:914082597
网站建设公司专业从事:聊城做网站,聊城建网站,聊城网站建设,聊城网站制作,虚拟主机,域名注册,网站推广等服务
聊城共赢网络  
分公司:临清网站建设阳谷网站建设高唐网站建设茌平网站建设东阿网站建设冠县网站建设莘县网站建设