6-2 多态性与虚函数
Problem Description
Input
无
Output
输出数据共有3行,本题目要求输出内容必须与示例中的相同。
Example Input
Example Output
How does a pet speak ? I am a cat,My name is Tom My sound is miao!miao! I am a dog,My name is Snoppy My sound is wang!wang!
Hint
Author
黄晶晶
#include <iostream>
using namespace std;
class Pet
{
public:
virtual void speak()
{
cout<<"How does a pet speak ?"<<endl;
}
};
class cat:public Pet
{
public:
void speak()
{
cout<<"I am a cat,My name is Tom My sound is miao!miao!"<<endl;
}
};
class dog:public Pet
{
public:
void speak()
{
cout<<"I am a dog,My name is Snoppy My sound is wang!wang!"<<endl;
}
};
int main()
{
Pet*p;
p=new Pet;
p->speak();
delete p;
p=new cat;
p->speak();
delete p;
p=new dog;
p->speak();
delete p;
return 0;
}
什么叫多态?
多态是指一种事物的多种形态。
在C++中,指具有同一个函数名的不同功能的函数
面向对象方法中描述多态性:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。
多态性分为以下两类:
1.静态多态性(编译时的多态性):编译器对源程序进行编译时确定所调用的是哪一个函数。
实现方式:函数重载、运算符重载
2.动态多态性(运行时的多态性):在程序运行过程中根据具体情况确定调用的是哪一个函数。
实现方式:虚函数
虚函数:
作用:允许在派生类中重新定义与基类同名的函数,并通过指向派生类的基类指针,访问派生类中同名成员函数。
格式:虚函数定义格式:
virtual 函数返回类型 函数名(参数表)
{ 函数体 }
使用方法:1.在派生类中重新定义该函数,要求函数名、函数类型、参数表完全相同。但不加virtual关键字。
2.只有位于类内的虚函数声明时,加上关键字virtual,在类外定义虚函数时,不加virtual。
3.C++规定:若一个成员函数被声明为虚函数,其派生类的同名函数自动成为虚函数。
4.定义一个指向基类对象的指针,并使它指向同一类族中的某一对象;通过该指针调用虚函数,此时调用的就是指针指向的派生对象的同名函数。
函数重载与虚函数的不同比较:
1.函数重载是解决的是同一层次上的同名函数的问题,是横向重载。
2.虚函数解决的是不同派生层次上的同名函数的问题,相当于纵向重载。
3.同一类族的虚函数的首部是相同的,而函数重载时函数的首部不相同(参数表不能相同)。