C++虚函数实现多态

C++是通过虚函数来解决多态问题的
虚函数,就是在基类声明函数是虚拟的,并不是实际存在的函数,然后再派生类中才正式定义此函数。在程序运行期间,用指针指向某一派生类对象,这样就能调用指针指向的派生类对象中的函数,而不会调用其他派生类中的函数。
注意:虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或者引用来访问基类和派生类中的同名函数。

通过代码看看虚函数的作用

#include<iostream>
using namespace std;

/******************************Student**********************************/
class Student
{
protected:
    char *name;
    bool sex;
public:
    Student(char *name,bool sex):name(name),sex(sex){}
    void display();
};
/***********************************/
void Student::display()
    {
    cout<<"name : "<<name<<endl\
        <<"sex  : "<<sex<<endl<<endl;
    }
/******************************Graduate**********************************/
class Graduate:public Student
{
protected:
    float wage;
public:
    Graduate(char* name,bool sex,float wage):Student(name,sex),wage(wage){}
    void display();
};
/***********************************/
void Graduate::display()
{
cout<<"name : "<<name<<endl\
    <<"sex  : "<<sex<<endl;
cout<<"wage : "<<wage<<endl<<endl;
}
/************************************************************************/
int main()
{
Student stu1("XiaoMing",1);
Graduate stu2("DaLan",0,100000);

Student *p=&stu1;
p->display();

p=&stu2;
p->display();
return 0;
}

注意: 在Student的display()前面没有加 virtual
下面是运行结果

这里写图片描述
然后加上virtual看看

#include<iostream>
using namespace std;

/******************************Student**********************************/
class Student
{
protected:
    char *name;
    bool sex;
public:
    Student(char *name,bool sex):name(name),sex(sex){}
    virtual void display();
};
/***********************************/
void Student::display()
    {
    cout<<"name : "<<name<<endl\
        <<"sex  : "<<sex<<endl<<endl;
    }
/******************************Graduate**********************************/
class Graduate:public Student
{
protected:
    float wage;
public:
    Graduate(char* name,bool sex,float wage):Student(name,sex),wage(wage){}
    void display();
};
/***********************************/
void Graduate::display()
{
cout<<"name : "<<name<<endl\
    <<"sex  : "<<sex<<endl;
cout<<"wage : "<<wage<<endl<<endl;
}
/************************************************************************/
int main()
{
Student stu1("XiaoMing",1);
Graduate stu2("DaLan",0,100000);

Student *p=&stu1;
p->display();

p=&stu2;
p->display();
return 0;
}

下面是运行结果
这里写图片描述

这就是多态性,对同一消息,不同的对象有不同的相应方式。

虚函数的使用方法是:

  1. 在基类中用virtual声明成员函数为虚函数。在类外定义虚函数时,不必再加virtual
  2. 在派生类中重新定义此函数时,函数名,函数类型,函数参数,个数及类型必须与基类的虚函数相同,根据派生类的需要重新定义函数体。当一个成员函数被声明为虚函数时,其派生类中同名的函数都自动生成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但是习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。
  3. 定义一个指向基类对象的变量,并使他指向同一类族中需要调用该函数的对象。
  4. 通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。

需要说明的是:使用虚函数,系统要有一定量的空间开销。当一个类带有虚函数时,编译系统会为这个类构造一个虚函数表,他是一个指针数组,存放每个虚函数的入口地址。系统在进行动态关联时的时间实现很少的,因此多态性是高效的。


虚析构函数

如果将基类的析构函数声明为虚函数时,由该基类所派生的所有派生类均自动生成为虚函数,即使派生类的析构函数与基类的析构函数名不同。

#include<iostream>
using namespace std;
class A
{
public:
    virtual ~A()
    {
    cout<<"A is destory"<<endl;
    }
};
class B:public A
{
public :
    ~B()
    {
     cout<<"B is destory"<<endl;
    }
};
int main()
{
A *p=new B;
delete p;
return 0;
}

纯虚函数

纯虚函数是在声明虚函数时被“初始化”为0的函数
一般形式为
virtual 函数类型 函数名(参数列表)=0;
1. 纯虚函数没有函数体
2. =0不表示返回值为0,只是形式上的作用,告诉编译系统是纯虚函数,留在派生类中定义
3. 在派生类中定义之后,才具备函数的功能,可以被调用
4. 纯虚函数的作用是在基类中为派生类保留一个函数的名字,以便派生类根据需要对他进行定义。
5. 如果在一个类中生命了纯虚函数,而在其派生类中仍没有对该函数定义,则该函数在派生类中仍为纯虚函数。
6. 析构函数一般不定义成纯虚函数,可以定义成空的虚函数。

#include<iostream>
using namespace std;
class A
{
public:
    virtual void display()=0;
    virtual ~A()
    {
    cout<<"A is destory"<<endl;
    }
};
class B:public A
{
public :
    void display()
    {
    cout<<"hello"<<endl;
    }
    ~B()
    {
     cout<<"B is destory"<<endl;
    }
};
int main()
{
A *p=new B;
p->display();
delete p;
return 0;
}
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值